Я запускаю webapp2 в Google Cloud SDK и использую модуль Naked
для запуска скриптов node.js из python2 в поле Vagrant. При запуске сервера, который имеет этот фрагмент кода
from Naked.toolshed.shell import muterun_js
def get_signed_hash(username):
response_from_js = muterun_js('./views/api/generateSignedTransaction.js',
nonce)
signed_hash = response_from_js.stdout
print('0x' + signed_hash)
Я получаю это сообщение об ошибке
ImportError: No module named Naked.toolshed.shell
Я также использую библиотеку requests
и это не вызывает никаких проблем. Пробовал отлаживать проблему, касающуюся расположения пакетов, они оба находятся в одном и том же месте:
>>> import requests
>>> print(requests.__file__)
/home/vagrant/.local/lib/python2.7/site-packages/requests/__init__.pyc
>>> import Naked
>>> print(Naked.__file__)
/home/vagrant/.local/lib/python2.7/site-packages/Naked/__init__.pyc
Infact Я запускал сценарий в том же месте, что и автономный файл, вызывающий get_signed_hash('username')
и он запускается успешно. Есть ли другое место, которое мне нужно проверить?
Для стандартного окружения приложений первого поколения необходимо установить зависимости внутри приложения (или поставщика). Недостаточно иметь их в системных site-packages
(где обычные, автономные приложения загружают библиотеки). Даже если вы каким-то образом убедите локальный сервер разработки для запуска приложения, он не будет работать при загрузке в GAE, поскольку GAE не имеет доступа к вашей локальной системе.
Как правило, вы устанавливаете свою библиотеку (и все ее зависимости) внутри каталога lib
внутри вашего каталога приложений, чтобы они могли быть загружены в GAE вместе с вашим приложением. См. Копирование сторонней библиотеки.
В качестве альтернативы вы можете попытаться просто символизировать каталог Naked
в вашем каталоге lib
, который может работать, если все остальные зависимости уже удовлетворяются аналогичным образом. См. Раздел Как мне получить доступ к библиотеке, выпущенной из модуля, в Python Google App Engine?
subprocess.check_output
и subprocess.call
но оба они недоступны, хотя они являются частью официальных модулей, как @Mangu указал в комментариях, а также по общей ссылке, которую вы не можете включать в модули с С зависимости. Нужно ли использовать процесс, данный вами, для поставляемых модулей?
subprocess
из-за другого ограничения песочницы - делать недопустимые системные вызовы - не может запускать процессы.