Почему Twistd не может импортировать модуль из его текущего рабочего каталога? - PullRequest
0 голосов
/ 11 июня 2018

Пожалуйста, рассмотрите следующий тестовый пример.

Каталог проекта структурирован следующим образом:

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> нет.

У меня двоякий вопрос:

  1. Это ошибка или есть веская причина для twistd вести себя таким образом?
  2. Какой рекомендуемый способ исправить этов twistd.Есть ли какая-то опция, которую я могу установить, или это нужно сделать вручную?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

этот фрагмент добавляет каталог, содержащий tac-файл, к пути python

import os
import sys

sys.path.append(os.path.abspath(os.path.dirname(__file__)))

from foo.bar import Bar
0 голосов
/ 11 июня 2018

В Python нет правила, согласно которому рабочий каталог должен находиться в пути.Скорее, по умолчанию, Python помещает каталог основного сценария в путь.Когда вы запускаете python test.tac, этот каталог является рабочим каталогом, но когда вы запускаете twistd, основным скриптом Python является некоторая часть Twisted, которая не находится в рабочем каталоге.

Поскольку я не знаком сTwisted, я не могу сказать, какую комбинацию организации кода и конфигурации Twisted вы должны использовать, чтобы этот импорт работал.

...