python-2.7 google-app-engine appcfg

python 2.7 - appcfg.py no funciona en la línea de comando



python-2.7 google-app-engine (3)

Solo tengo problemas para entender por qué este comando:

>appcfg.py -A adept-box-109804 update app.yaml

tal como se indica en la página Probar Google App Engine ahora no funciona. Descargué el SDK de App Engine para Python y configuré Path para que apunte a la ubicación de appcfg.py, pero ejecutar appcfg.py en el directorio raíz de mis proyectos no funciona en la línea de comandos. Tengo que navegar a la carpeta que contiene appcfg.py y hacer

>python appcfg.py help

o hacer

>python "C:/Program Files (x86)/Google/google_appengine/appcfg.py" help

para obtener un comando para trabajar desde cualquier lugar. Utilicé el último método para implementar mi aplicación de prueba, pero me preguntaba si alguien podría explicar por qué el comando dado por el sencillo tutorial de Google no hizo nada. También verifiqué para asegurarme de que los archivos .py se abran automáticamente con el intérprete Python 2.7, de modo que se ejecute un archivo hello.py en la línea de comandos simplemente escribiendo

>hello.py

y generará su declaración de impresión. Por otro lado, usar appcfg.py de manera similar proporciona el mismo resultado sin importar los argumentos (tenga en cuenta que trunqué el resultado, pero tenga la seguridad de que son idénticos sin importar los argumentos:

C:/>appcfg.py help backends Usage: appcfg.py [options] <action> Action must be one of: backends: Perform a backend action. backends configure: Reconfigure a backend without stopping it. backends delete: Delete a backend. backends list: List all backends configured for the app. backends rollback: Roll back an update of a backend. backends start: Start a backend. backends stop: Stop a backend. backends update: Update one or more backends. create_bulkloader_config: Create a bulkloader.yaml from a running application. cron_info: Display information about cron jobs. delete_version: Delete the specified version for an app. download_app: Download a previously-uploaded app. download_data: Download entities from datastore. help: Print help for a specific action. list_versions: List all uploaded versions for an app. request_logs: Write request logs in Apache common log format. resource_limits_info: Get the resource limits. rollback: Rollback an in-progress update. set_default_version: Set the default (serving) version. start_module_version: Start a module version. stop_module_version: Stop a module version. update: Create or update an app version. update_cron: Update application cron definitions. update_dispatch: Update application dispatch definitions. update_dos: Update application dos definitions. update_indexes: Update application indexes. update_queues: Update application task queue definitions. upload_data: Upload data records to datastore. vacuum_indexes: Delete unused indexes from application. Use ''help <action>'' for a detailed description. C:/>appcfg.py help update Usage: appcfg.py [options] <action> Action must be one of: backends: Perform a backend action. backends configure: Reconfigure a backend without stopping it. backends delete: Delete a backend. backends list: List all backends configured for the app. backends rollback: Roll back an update of a backend. backends start: Start a backend. backends stop: Stop a backend. backends update: Update one or more backends. create_bulkloader_config: Create a bulkloader.yaml from a running application. cron_info: Display information about cron jobs. delete_version: Delete the specified version for an app. download_app: Download a previously-uploaded app. download_data: Download entities from datastore. help: Print help for a specific action. list_versions: List all uploaded versions for an app. request_logs: Write request logs in Apache common log format. resource_limits_info: Get the resource limits. rollback: Rollback an in-progress update. set_default_version: Set the default (serving) version. start_module_version: Start a module version. stop_module_version: Stop a module version. update: Create or update an app version. update_cron: Update application cron definitions. update_dispatch: Update application dispatch definitions. update_dos: Update application dos definitions. update_indexes: Update application indexes. update_queues: Update application task queue definitions. upload_data: Upload data records to datastore. vacuum_indexes: Delete unused indexes from application. Use ''help <action>'' for a detailed description.


Finalmente rastreé la verdadera razón, y no fue un error con el SDK de AppEngine. Más bien fue con mi intérprete de Python, ya que noté que no aceptaba argumentos para ningún archivo .py. Resultó ser un error de registro, ubicado en [HKEY_CLASSES_ROOT/Applications/python.exe/shell/open/command] donde tuve que cambiar el valor de "C:/Python27/python.exe" "%1" a "C:/Python27/python.exe" "%1" %*

Sin embargo, no estoy seguro de cómo sucedió esto, ya sea el instalador de Python 2.7 o tal vez el SDK de AppEngine.


Su confusión probablemente se deba a la mezcla de 2 posibles estilos de invocación:

  1. python appcfg.py ...
  2. appcfg.py ...

El primero no puede hacer uso del hecho de que la ubicación del appcfg.py está en la ruta, es solo un argumento para el ejecutable de python , que no puede ubicar el archivo appcfg.py menos que:

  • lo encuentra en el directorio actual
  • el archivo appcfg.py se especifica utilizando una ruta completa o una ruta relativa al directorio de trabajo actual desde el que se invoca python

Esta es la razón por la cual sus comandos segundo y tercero no funcionan como cabría esperar. En cambio, usar el segundo estilo de invocación debería funcionar si la ubicación de appcfg.py está en la ruta, tal como lo hace su última invocación de comando.

Punto clave para recordar: la configuración de la ruta se aplica solo al ejecutable del comando, no a sus argumentos (que por cierto cada ejecutable puede procesar como lo desee, algunos ejecutables pueden combinar argumentos con la configuración de la ruta para obtener la ubicación de los archivos).

Del mismo modo, appcfg.py sí (una vez invocado con éxito utilizando cualquiera de los 2 estilos de invocación) debe poder localizar el archivo app.yaml especificado como argumento. No puede hacerlo a menos que:

  • lo encuentra en el directorio actual
  • el archivo app.yaml (o su directorio) se especifica utilizando una ruta completa o una ruta relativa al directorio de trabajo actual desde el que se invoca appcfg.py

Sospecho que la incapacidad de app.yaml para localizar su archivo app.yaml puede ser la razón por la cual el primer comando que mencionó no funcionó. Si no, debe proporcionar detalles sobre la falla.

Con respecto a por qué el resultado de su último comando es idéntico independientemente de los argumentos, no estoy seguro, podría ser un error en la versión de Windows del SDK. En Linux, la salida es diferente:

> appcfg.py help backends Usage: appcfg.py [options] backends <directory> <action> Perform a backend action. The ''backends'' command will perform a backends action. Options: -h, --help Show the help message and exit. -q, --quiet Print errors only. -v, --verbose Print info level logs. --noisy Print all logs. -s SERVER, --server=SERVER The App Engine server. -e EMAIL, --email=EMAIL The username to use. Will prompt if omitted. -H HOST, --host=HOST Overrides the Host header sent with all RPCs. --no_cookies Do not save authentication cookies to local disk. --skip_sdk_update_check Do not check for SDK updates. -A APP_ID, --application=APP_ID Set the application, overriding the application value from app.yaml file. -M MODULE, --module=MODULE Set the module, overriding the module value from app.yaml. -V VERSION, --version=VERSION Set the (major) version, overriding the version value from app.yaml file. -r RUNTIME, --runtime=RUNTIME Override runtime from app.yaml file. -E NAME:VALUE, --env_variable=NAME:VALUE Set an environment variable, potentially overriding an env_variable value from app.yaml file (flag may be repeated to set multiple variables). -R, --allow_any_runtime Do not validate the runtime in app.yaml --oauth2 Ignored (OAuth2 is the default). --oauth2_refresh_token=OAUTH2_REFRESH_TOKEN An existing OAuth2 refresh token to use. Will not attempt interactive OAuth approval. --oauth2_access_token=OAUTH2_ACCESS_TOKEN An existing OAuth2 access token to use. Will not attempt interactive OAuth approval. --authenticate_service_account Authenticate using the default service account for the Google Compute Engine VM in which appcfg is being called --noauth_local_webserver Do not run a local web server to handle redirects during OAuth authorization.


Tuve este problema, y ​​se profundizó en la versión local de Python variable que es diferente de la versión de Python del motor de aplicaciones. Entonces, la solución es agregar antes del script la ubicación actual de la versión de Python:

C:/Python27/python.exe "C:/Program Files (x86)/Google/google_appengine/appcfg.py"

Y simplemente vuelve a funcionar bien.