导入不带 .py 扩展名的 python 模块

新手上路,请多包涵

我有一个名为 foobar 的文件(没有 .py 扩展名)。在同一目录中,我有另一个尝试导入它的 python 文件:

 import foobar

但这只有在我将文件重命名为 foobar.py 时才有效。是否可以导入没有 .py 扩展名的 python 模块?

更新:该文件没有扩展名,因为我也将它用作独立脚本,并且我不想键入 .py 扩展名来运行它。

Update2:我将使用下面提到的符号链接解决方案。

原文由 compie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 822
2 个回答

您可以使用 imp.load_source 函数(来自 imp 模块)从给定的文件系统路径动态加载模块。

 import imp
foobar = imp.load_source('foobar', '/path/to/foobar')

SO 讨论 还显示了一些有趣的选项。

原文由 Eli Bendersky 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是 Python 3.4+ 的解决方案:

 from importlib.util import spec_from_loader, module_from_spec
from importlib.machinery import SourceFileLoader

spec = spec_from_loader("foobar", SourceFileLoader("foobar", "/path/to/foobar"))
foobar = module_from_spec(spec)
spec.loader.exec_module(foobar)

使用 spec_from_loader 并显式指定 SourceFileLoader 将强制 机器 将文件加载为源文件,而无需尝试从扩展名中找出文件的类型。这意味着您可以加载该文件,即使它未在 importlib.machinery.SOURCE_SUFFIXES 中列出。

如果您想在第一次加载后继续按名称导入文件,请将模块添加到 sys.modules

 sys.modules['foobar'] = foobar

您可以在我维护的名为 haggis 的实用程序库中找到该函数的实现。 haggis.load.load_module 具有将模块添加到 sys.modules 、设置自定义名称以及将变量注入命名空间供代码使用的选项。

原文由 Mad Physicist 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题