【问题标题】:imported python module from another directory fails从另一个目录导入 python 模块失败
【发布时间】:2020-09-18 10:23:12
【问题描述】:

我已经使用sys.path.insert 从 Linux 中的另一个目录导入了一个 python 模块,但是当我运行该模块时它失败了。由于导入的模块试图打开该模块的本地文件。请告诉我如何解决此问题。

users/adr/release/invoke.py  #this one fails with can’t open file ./config.ini

import sys

sys.path.insert(0, ‘/user/cdw/audit/’)

import audit_main

原始模块文件所在的路径。

/user/cdw/audit/audit_main.py  # this module opens config.ini file to read pplication credentials.
/user/cdw/audit/config.ini

/user/cdw/audit/__ini__.py

【问题讨论】:

  • 您可以使用该模块的__file__ 变量。 os.path.join(os.path.dirname(__file__), "config.ini")
  • 当问这些类型的问题时,如果你添加一个像this 这样的文件夹结构,并在代码块中添加你的错误的完整堆栈跟踪,会更好/更好。让我们的工作轻松很多。
  • @drum 你把那个编辑的缩进弄乱了。
  • @tdelaney,它正在工作。非常感谢!

标签: python python-import pythonpath


【解决方案1】:

当 python 加载一个模块时,它会将元数据添加到模块可以使用的全局命名空间中。 __file__ 是其 .py 文件的文件名 - 当这样的名称有意义时。您可以使用它来获取您的配置文件

import os
config_filename = os.path.join(os.path.dirname(__file__), "config.ini")

除非你不能。如果这是一个 C 扩展文件,或者该文件位于 zip、egg 或 pyinstaller 包或 exe 等其他包装中,则它可能无法正常工作。我假设用户可编辑的 ini 文件可能需要位于模块目录之外的某个位置。如果您将此 .py 作为可安装包的一部分,它可能最终位于用户无法编辑的系统目录中。这对这个项目来说可能不是问题,只是列出一些注意事项。

【讨论】:

  • 看看pkguti.get_data。它可以从 zips/eggs 以及文件系统中挖掘数据。但是,它不处理命名空间包。
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多