appcfg.py не работает в командной строке

У меня просто немного проблемы с пониманием, почему эта команда:

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

как указано на странице "Попробовать Google App Engine Now", не работает. Я скачал App Engine SDK для Python и настроил путь, указывающий на местоположение appcfg.py, но запуск appcfg.py в корневом каталоге моих проектов не работает в командной строке. Я должен либо перейти в папку, содержащую appcfg.py и сделать

>python appcfg.py help

или сделать

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

получить команду работать из любой точки мира. Я использовал последний метод для развертывания моего тестового приложения, но мне было просто интересно, если кто-то может объяснить, почему команда, приведенная в простом уроке Google, ничего не сделала. Я также проверил, чтобы файлы.py автоматически открывались с помощью интерпретатора Python 2.7, так что файл hello.py будет выполняться в командной строке простым вводом

>hello.py

и он выведет свой оператор печати. С другой стороны, использование appcfg.py аналогичным образом дает одинаковый вывод независимо от аргументов (обратите внимание, я обрезал вывод, но будьте уверены, что они идентичны независимо от аргументов:

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.

3 ответа

Решение

Ваша путаница, вероятно, связана с путаницей двух возможных стилей вызова:

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

1-й не может использовать тот факт, что расположение appcfg.py в пути, это просто аргумент python исполняемый файл, который не может найти appcfg.py файл, если либо:

  • находит его в текущем каталоге
  • appcfg.py файл указывается с использованием полного пути или пути относительно текущего рабочего каталога, из которого python вызывается

По этой причине ваши 2-я и 3-я команды не работают так, как вы ожидаете. Использование второго стиля вызова вместо этого должно работать, если расположение appcfg.py находится в пути - так же, как ваш последний вызов команды.

Ключевой момент, который следует помнить: конфигурация пути применяется только к исполняемому файлу команды, а не к ее аргументам (кстати, каждый исполняемый файл может обрабатывать по своему усмотрению, некоторые исполняемые файлы могут комбинировать аргументы с конфигурацией пути для получения местоположения файлов).

так же appcfg.py сам (после успешного вызова с использованием любого из 2 стилей вызова) должен иметь возможность найти app.yaml файл указан в качестве аргумента. Это не может быть сделано, если только:

  • находит его в текущем каталоге
  • app.yaml файл (или его каталог) указывается с использованием полного пути или пути относительно текущего рабочего каталога, из которого appcfg.py вызывается

Я подозреваю appcfg.pyнеспособность определить местонахождение вашего app.yaml файл может быть причиной, по которой первая упомянутая вами команда не работает. Если нет, вы должны предоставить подробную информацию о сбое.

Относительно того, почему вывод вашей последней команды идентичен независимо от аргументов, я не уверен, что это может быть ошибкой в ​​Windows-версии SDK. В Linux выход отличается:

> 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.

Я наконец нашел настоящую причину, и это не было ошибкой в ​​AppEngine SDK. Скорее это было с моим интерпретатором Python, поскольку я заметил, что он не принимает аргументы для каких-либо файлов.py. Оказалось, что это ошибка реестра, расположенная по адресу [HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command] где я должен был изменить значение "C:\Python27\python.exe" "%1" в "C:\Python27\python.exe" "%1" %*

Как это произошло, будь то установщик Python 2.7 или, может быть, SDK AppEngine, я не уверен, хотя.

У меня была эта проблема, и она углублена в версию Python для локальной переменной, которая отличается от версии Python для движка приложений. Поэтому решение состоит в том, чтобы просто добавить перед сценарием текущее местоположение версии Python:

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

И это просто вернуться к работе хорошо.

Другие вопросы по тегам