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 ответа
Ваша путаница, вероятно, связана с путаницей двух возможных стилей вызова:
python appcfg.py ...
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"
И это просто вернуться к работе хорошо.