我创建了一个不错的 python Twisted 应用程序,带有一个用于 twistd runner 的插件,如 Twisted 文档中所述:http: //twistedmatrix.com/documents/current/core/howto/tap.html。我在使用 PyInstaller 打包时遇到问题:在执行冻结的应用程序期间找不到我的 twistd 插件。
为了发布我的项目,我使用 twistd runner 模块创建了自己的顶级启动脚本,例如
#!/usr/bin/env python
from twisted.scripts.twistd import run
from sys import argv
argv[1:] = [
'--pidfile', '/var/run/myapp.pid',
'--logfile', '/var/run/myapp.log',
'myapp_plugin'
]
run()
接下来,我使用 PyInstaller 将其冻结为单目录部署。执行上面的冻结脚本失败,因为它找不到我的 twistd 插件(为简洁而编辑):
~/pyinstall/dist/bin/mystartup?16632/twisted/python/modules.py:758:
UserWarning: ~/pyinstall/dist/mystartup?16632 (for module twisted.plugins)
not in path importer cache (PEP 302 violation - check your local configuration).
~/pyinstall/dist/bin/mystartup: Unknown command: myapp_plugin
通常,Twistd 检查 Python 系统路径以在 twisted/plugins/myapp_plugin.py 中发现我的插件。如果我在启动脚本中打印扭曲插件列表,则该列表在 PyInstaller 生成的可执行文件中为空,例如
from twisted.plugin import IPlugin, getPlugins
plugins = list(getPlugins(IPlugin))
print "Twistd plugins=%s" % plugins
我使用了一个有点默认的 PyInstaller 规范文件,没有指定隐藏的导入或导入钩子。
我喜欢带日志记录、pid 文件等的twistd 功能,所以我想避免完全放弃twistd runner 来规避插件问题。有没有办法确保在冻结的可执行文件中找到我的 twistd 插件?