从不同目录执行时在python中导入错误

时间:2014-08-03 10:46:13

标签: python thrift

我正在尝试在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

找到

1 个答案:

答案 0 :(得分: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.buildoutpyInstaller等工具创建包含自己的库的捆绑应用程序。或者,您可以使用对您的目录执行chdir的shell脚本,然后运行您的脚本。或者构建可重定位的虚拟环境并手动将库安装到其站点包中。等等。但是真的。

如果您真的需要能够将所有文件保留在开发目录中但从任何地方运行它们,那么执行此操作的方法是在启动时添加到sys.path

import sys
import os
scriptdir = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(scriptdir)
import ThriftTest