python - 为什么 twistd 不能从当前工作目录导入模块?
问题描述
请考虑以下测试用例。
项目目录的结构如下:
foo
├── foo
│ ├── __init__.py
│ └── bar.py
└── test.tac
bar.py
包含一个平凡的类定义:
# bar.py
class Bar:
pass
test.tac
,Twisted 应用程序配置文件,包含一个导入语句:
#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
。我可以设置某种选项还是需要手动完成?
解决方案
此代码段会将包含 tac 文件的目录添加到 python 路径
import os
import sys
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
from foo.bar import Bar
推荐阅读
- bash - 如何从 Heroku 为单个 bash 命令设置环境变量,而不是为整个 shell 会话设置环境变量?
- python - 如何使用循环和命令输出的if条件
- python - 如何使用flask/python从sql表中获取
- swt - jface TreeViewer 的滚动锁定
- python - flask sqlalchemy 将数据库名称作为字符串传递
- electron - 如何在电子应用程序中包含模板组件的分布
- python-3.x - 在 Pandas 中查找目录中的总文件大小
- c - 使用 Struct 和 Pointers 对数组元素进行排序
- c - C:如何打开以特定扩展名结尾的文件
- python - 如何修复'ValueError:allow_pickle = False时无法加载包含腌制数据的文件;?