从不同目录执行时出现Python导入错误

1 投票
1 回答
989 浏览
提问于 2025-04-18 15:48

我正在尝试在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.buildoutpyInstaller 这样的工具来创建包含自己库的打包应用程序。或者你可以写一个 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

撰写回答