twistd -n web 不适用于 Klein 和 Python3
twistd -n web not working with Klein and Python3
我正在尝试 运行 与 Klein 一起扭曲网络,但遇到了很多问题。
即使从示例中尝试 运行 - 也会得到相同的结果。
Source
from klein import Klein
app = Klein()
@app.route('/')
def hello(request):
return "Hello, world!"
resource = app.resource
然后运行它(在这个例子中,上面的文件保存为twistdPlugin.py:
$ twistd -n web --class=twistdPlugin.resource
错误:
sh-3.2# twistd -n web --class=twistdPlugin.resource
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/bin/twistd", line 11, in <module>
load_entry_point('Twisted==17.9.0', 'console_scripts', 'twistd')()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/scripts/twistd.py", line 29, in run
app.run(runApp, ServerOptions)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/application/app.py", line 657, in run
config.parseOptions()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/application/app.py", line 624, in parseOptions
usage.Options.parseOptions(self, options)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/usage.py", line 267, in parseOptions
self.subOptions.parseOptions(rest)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/usage.py", line 255, in parseOptions
self._dispatch[optMangled](optMangled, arg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/usage.py", line 411, in <lambda>
fn = lambda name, value, m=method: m(value)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/web/tap.py", line 121, in opt_class
classObj = reflect.namedClass(className)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/reflect.py", line 173, in namedObject
module = namedModule('.'.join(classSplit[:-1]))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/reflect.py", line 159, in namedModule
topLevel = __import__(name)
ModuleNotFoundError: No module named 'twistdPlugin'
如何处理?
您可以通过 2 种方法中的 1 种解决。第一种方法是将包含源代码的目录添加到 PYTHONPATH
环境变量中。这是最简单的方法。
PYTHONPATH=$(pwd) twistd -n web --class twistdPlugin.resource
或者你可以制作一个 virtualenv 并在那里安装你的 twistdPlugin
模块。这样你就不用自己搞乱环境变量了。
tl;dr 问题是 twistd 曾经在 Python 2 Twisted < 16.4 中获取当前目录,但它不再这样做了Python 3 最新的 Twisted。换句话说,twistd 期望所有模块都是可导入的。尽管有时令人讨厌,但这种设计使 twistd 应用程序可移植。
我正在尝试 运行 与 Klein 一起扭曲网络,但遇到了很多问题。 即使从示例中尝试 运行 - 也会得到相同的结果。 Source
from klein import Klein
app = Klein()
@app.route('/')
def hello(request):
return "Hello, world!"
resource = app.resource
然后运行它(在这个例子中,上面的文件保存为twistdPlugin.py:
$ twistd -n web --class=twistdPlugin.resource
错误:
sh-3.2# twistd -n web --class=twistdPlugin.resource
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/bin/twistd", line 11, in <module>
load_entry_point('Twisted==17.9.0', 'console_scripts', 'twistd')()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/scripts/twistd.py", line 29, in run
app.run(runApp, ServerOptions)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/application/app.py", line 657, in run
config.parseOptions()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/application/app.py", line 624, in parseOptions
usage.Options.parseOptions(self, options)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/usage.py", line 267, in parseOptions
self.subOptions.parseOptions(rest)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/usage.py", line 255, in parseOptions
self._dispatch[optMangled](optMangled, arg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/usage.py", line 411, in <lambda>
fn = lambda name, value, m=method: m(value)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/web/tap.py", line 121, in opt_class
classObj = reflect.namedClass(className)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/reflect.py", line 173, in namedObject
module = namedModule('.'.join(classSplit[:-1]))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/twisted/python/reflect.py", line 159, in namedModule
topLevel = __import__(name)
ModuleNotFoundError: No module named 'twistdPlugin'
如何处理?
您可以通过 2 种方法中的 1 种解决。第一种方法是将包含源代码的目录添加到 PYTHONPATH
环境变量中。这是最简单的方法。
PYTHONPATH=$(pwd) twistd -n web --class twistdPlugin.resource
或者你可以制作一个 virtualenv 并在那里安装你的 twistdPlugin
模块。这样你就不用自己搞乱环境变量了。
tl;dr 问题是 twistd 曾经在 Python 2 Twisted < 16.4 中获取当前目录,但它不再这样做了Python 3 最新的 Twisted。换句话说,twistd 期望所有模块都是可导入的。尽管有时令人讨厌,但这种设计使 twistd 应用程序可移植。