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:
-
python appcfg.py ...
-
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 invocapython
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 invocaappcfg.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.