从不同目录执行时python中的导入错误
我正在尝试在thrift/test/py文件夹中运行TestServer.py。当我从测试文件夹执行它时,它工作正常。但当我从thrift文件夹执行它时,它给了我以下导入错误从不同目录执行时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
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