Пожалуйста, рассмотрите следующий тестовый пример.
Каталог проекта структурирован следующим образом:
foo
├── foo
│ ├── __init__.py
│ └── bar.py
└── test.tac
bar.py
содержит тривиальное определение класса:
# bar.py
class Bar:
pass
test.tac
, файл конфигурации Twisted Application, содержит один оператор импорта:
#test.tac
from foo.bar import Bar
При запуске twistd -ny test.tac
я получаю следующую ошибку:
$ twistd -ny test.tac
Unhandled Error
Traceback (most recent call last):
File "/Users/lthibault/.pyenv/versions/3.6.2/lib/python3.6/site-packages/twisted/application/app.py", line 674, in run
runApp(config)
File "/Users/lthibault/.pyenv/versions/3.6.2/lib/python3.6/site-packages/twisted/scripts/twistd.py", line 25, in runApp
runner.run()
File "/Users/lthibault/.pyenv/versions/3.6.2/lib/python3.6/site-packages/twisted/application/app.py", line 381, in run
self.application = self.createOrGetApplication()
File "/Users/lthibault/.pyenv/versions/3.6.2/lib/python3.6/site-packages/twisted/application/app.py", line 453, in createOrGetApplication
application = getApplication(self.config, passphrase)
--- <exception caught here> ---
File "/Users/lthibault/.pyenv/versions/3.6.2/lib/python3.6/site-packages/twisted/application/app.py", line 464, in getApplication
application = service.loadApplication(filename, style, passphrase)
File "/Users/lthibault/.pyenv/versions/3.6.2/lib/python3.6/site-packages/twisted/application/service.py", line 416, in loadApplication
application = sob.loadValueFromFile(filename, 'application')
File "/Users/lthibault/.pyenv/versions/3.6.2/lib/python3.6/site-packages/twisted/persisted/sob.py", line 177, in loadValueFromFile
eval(codeObj, d, d)
File "test.tac", line 1, in <module>
from foo.bar import Bar
builtins.ModuleNotFoundError: No module named 'foo'
Failed to load application: No module named 'foo'
Это очень удивительнопотому что python test.tac
не выдает ошибок.Для дальнейшей отладки я изменил test.tac
следующим образом:
from sys import path
print(path)
from foo.bar import Bar
Это показало, что при запуске python <filename>
предварительный рабочий каталог добавляется к пути, тогда как при запуске twistd <filename>
нет.
У меня двоякий вопрос:
- Это ошибка или есть веская причина для
twistd
вести себя таким образом? - Какой рекомендуемый способ исправить этов
twistd
.Есть ли какая-то опция, которую я могу установить, или это нужно сделать вручную?