我正在尝试在 thrift/test/py 文件夹中运行 TestServer.py。当我从测试文件夹执行它时,它工作正常。但是当我从 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 找到。
最佳答案
您的脚本假设其所有模块都位于 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
操作,然后运行您的脚本。或者构建可重定位的虚拟环境并将库手动安装到其站点包中。等等。但确实如此。
如果您确实需要能够将所有文件保留在开发目录中,但从任何地方运行它们,则方法是在启动时添加到 sys.path
:
import sys
import os
scriptdir = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(scriptdir)
import ThriftTest
关于python - 从不同目录执行时python导入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25103913/