python grep plone zope

python - ¿Cómo grep a través del código que vive en muchos directorios diferentes?



plone zope (12)

Estoy trabajando en un programa de Python que hace un uso intensivo de los huevos (Plone). Eso significa que hay 198 directorios llenos de código Python que podría querer buscar durante la depuración. ¿Hay una buena manera de buscar solo los archivos .py en esos directorios, evitando códigos no relacionados y archivos binarios grandes?


En caso de que desee una solución OSS sin línea de comandos ...

Yo uso pycharm. Se ha construido en soporte para buildout. Lo apunta a un bin / instance generado por buildout y establece las dependencias externas de los proyectos a todos los huevos utilizados por la instancia. Entonces toda la introspección y el código de navegación del IDE funcionan bien. Definición de Goto, instancias de Goto, soporte de refactorización y por supuesto búsqueda.


Este problema fue la motivación para la creación de collective.recipe.omelette. Es una receta desarrollada que puede vincular todos los huevos de su conjunto de trabajo en una estructura de directorio, a la que puede apuntar su utilidad de búsqueda favorita.


Mi vida de grep es mucho más satisfactoria desde que descubrí el comando rgrep de Emacs.

Digamos que quiero encontrar ''IPortletDataProvider'' en la fuente de Plone. Hago:

  1. Mx rgrep
  2. Emacs solicita la cadena de búsqueda (IPortletDataProvider)
  3. ... luego qué archivos buscar (* .py)
  4. ... entonces qué directorio (~ / Plone / buildout-cache / eggs). Si ya estoy editando un archivo, este es el directorio de ese archivo, que generalmente es exactamente lo que quiero.

Los resultados aparecen en un nuevo buffer. En la parte superior está el find | xargs grep find | xargs grep command Emacs corrió. Todos los partidos están resaltados. Puedo buscar en el búfer usando los comandos de búsqueda de texto estándar. Lo mejor de todo es que puedo presionar Enter (o hacer clic) en una partida para abrir ese archivo.

Es una muy buena manera de trabajar. Me gusta que no tengo que recordar find | xargs grep secuencias de argumentos find | xargs grep , pero que todo ese poder está ahí si lo necesito.


OpenGrok es una excelente opción para la búsqueda de fuentes y la navegación. Sin embargo, se ejecuta en Java.

Realmente desearía que hubiera algo como http://opengrok.plone.org/


Recomiendo grin a la búsqueda, la omelette cuando se trabaja con plone y la función pydev ''Globals browser'' (con eclipse o aptana studio).


Recomiendo encarecidamente ack , un sustituto de grep, "dirigido a programadores con grandes árboles de código fuente heterogéneo" (del sitio web)


También hay idutils de GNU si desea grep para identificadores en un gran árbol de origen muy rápidamente. Requiere la creación de una base de datos de búsqueda por adelantado, ejecutando mkid (y ajustando su archivo de configuración para no ignorar los archivos .py). z3c.recipe.tag se encarga de eso, si usa buildout.


También uso mucho el ack en estos días. Lo modifiqué un poco para encontrar todos los tipos de archivos relevantes:

# Add zcml to the xml type: --type-add xml=.zcml # Add more files the plone type: --type-add plone=.dtml,.zpt,.kss,.vpy,.props # buildout config files --type-set buildout=.cfg # Include our page templates to the html type so we can limit our search: --type-add html=.pt,.zpt # Create txt file type: --type-set txt=.txt,.rst # Define i18n file types: --type-set i18n=.pot,.po # More options --follow --ignore-case --nogroup

Es importante recordar que ack no encontrará archivos si la extensión no está en su configuración. Consulte "ack --help-types" para ver todos los tipos disponibles.

También asumo que estás usando una omelette para que puedas grep / ack / encontrar todos los archivos relacionados.


Y simplemente porque no hay suficientes respuestas ...

Si se está desarrollando de manera rutinaria, vale la pena el esfuerzo de instalar Eclipse con Pydev (o incluso más sencillo, Aptana Studio, que es un Eclipse modificado), en cuyo caso las herramientas de búsqueda están justo ahí.


find <directory> -name ''*.py'' -exec grep <pattern> {} /;


find DIRECTORY -name "*.py" | xargs grep PATTERN

Por cierto, desde que escribí esto, he descubierto ack , que es una solución mucho mejor.

(Y desde esa edición, he descubierto AG).


grep -r -n "PATTERN" --include="*.py" DIRECTORY