从不同目录执行时出现Python导入错误
我正在尝试在thrift/test/py文件夹中运行TestServer.py。当我从test文件夹执行它时,一切正常。但是当我从thrift文件夹执行时,就出现了以下导入错误。
Traceback (most recent call last):
File "test/py/TestServer.py", line 51, in <module>
from ThriftTest import ThriftTest
ImportError: No module named ThriftTest
导致错误的那一行代码如下。
from ThriftTest import ThriftTest
这是什么原因呢?完整的Python脚本可以在这里找到:https://github.com/apache/thrift/blob/master/test/py/TestServer.py
1 个回答
1
你的脚本假设所有的模块都会在 sys.path
里。当前的工作目录会自动放在 sys.path
中,但顶层脚本所在的目录却不会。
通常的解决办法是使用 distutils
来构建一个分发包(或者更好的是,使用第三方模块 setuptools
),然后安装它(用常见的 python setup.py install
命令)。这样,脚本就会放在像 /usr/local/bin/TestServer.py
这样的地方,而模块则会放在像 /usr/local/lib/python3.4/site-packages/ThriftTest
这样的地方,其中 /usr/local/lib/python3.4/site-packages/
是你默认的 sys.path
之一。
另外,你也可以使用像 zc.buildout
或 pyInstaller
这样的工具来创建包含自己库的打包应用程序。或者你可以写一个 shell 脚本,先用 chdir
切换到你的目录,然后再运行你的脚本。或者构建可移动的虚拟环境,并手动将库安装到它们的 site-packages 中。还有其他方法。但实际上。
如果你真的需要在开发目录中保持所有文件,但又想从任何地方运行它们,最简单的方法是在启动时将其添加到 sys.path
中:
import sys
import os
scriptdir = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(scriptdir)
import ThriftTest