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

标签 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 找到。

最佳答案

您的脚本假设其所有模块都位于 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 操作,然后运行您的脚本。或者构建可重定位的虚拟环境并将库手动安装到其站点包中。等等。但确实如此。

如果您确实需要能够将所有文件保留在开发目录中,但从任何地方运行它们,则方法是在启动时添加到 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/

相关文章:

python - 在逗号上拆分字符串但忽略双引号内的逗号?

Thrift可以使用http,但它是二进制通信协议(protocol)?

c# - 什么是 http 500 响应的 Thrift 等价物?

hadoop - org.apache.hive.jdbc.HiveDriver : HiveBaseResultSet has not implemented absolute()?

python - 交换 numpy 数组中的两个值。

python - Python Thread()删除换行符?

python - 如何在 Python 的 Tkinter 中制作一个交互式列表,并包含可以编辑这些列表的按钮?

python - 具有可变数量测试的 PyUnit

python - 在Thrift Python服务器上,如何使用TThreadPoolServer配置池中的最大线程数?

java - 使用 thrift 将 LongType 插入 Cassandra 失败