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

从不同目录执行时python中的导入错误,python,thrift,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 T

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

这是什么原因?完整的python脚本可以在

中找到。您的脚本假设它的所有模块都将位于
sys.path
中。当前工作目录将自动放置在
sys.path
中,但顶级脚本所在的目录不在其中

通常的解决方案是使用
distutils
(或者更好的是,使用第三方模块
setuptools
)构建一个发行版,然后安装它(使用通常的
python setup.py安装
)。然后,脚本的位置类似于
/usr/local/bin/TestServer.py
,而模块的位置类似于
/usr/local/lib/python3.4/site packages/ThriftTest
,其中
/usr/local/lib/python3.4/site packages/
位于默认的
系统路径上

或者,您可以使用诸如
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

我无法更改目录层次结构,因此我如上所述更改了TestServer.py,。但仍然得到相同的结果。@ChamilaWijayarathna:请尝试打印
scriptdir
,以确保它符合您的预期。在某些情况下,
sys.argv[0]
只是一个文件名,而不是相对或绝对路径名,在这种情况下,这将不起作用。在这种情况下,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
import sys
import os
scriptdir = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(scriptdir)
import ThriftTest