导入一个没有.py扩展名的python模块

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

import foobar 

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

更新:该文件没有扩展名,因为我也使用它作为一个独立的脚本,我不想input.py扩展名来运行它。

Update2:我会去下面提到的符号链接解决scheme。

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

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

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

imp.load_source(module_name, path)应该做的,或者你可以做更详细的imp.load_module(module_name, file_handle, ...)路由,如果你有一个文件句柄

就像其他人所说的,你可以使用imp.load_source,但是会让你的代码更难阅读。 如果您需要导入名称或path未知的模块,我只能推荐它,直到运行时。

你不想使用.py扩展名的原因是什么? 不希望使用.py扩展名的最常见情况是因为python脚本也作为可执行文件运行,但您仍然希望其他模块能够导入它。 如果是这种情况,将function移动到具有相似名称的.py文件中,然后使用foobar作为包装可能会有所帮助。

以下是Python 3.4+的解决scheme:

 from importlib.util import spec_from_loader 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将强制机器将文件作为源文件加载,而无需从扩展中找出文件的types。 这意味着即使没有列在importlib.machinery.SOURCE_SUFFIXES ,也可以加载该文件。

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

 sys.modules['foobar'] = foobar 

如果你使用包pipe理器(deb或者类似的)安装脚本,另一个select是使用setuptools:

“…在Windows和POSIX平台上,脚本的文件名都不符合本地约定,另一方面,当你的实际”main“是一个”main“脚本时,你通常必须为”main“脚本创build一个单独的文件函数在一个模块的某个地方… setuptools修复所有这些问题,为您自动生成正确的扩展名的脚本,在Windows上它甚至会创build一个.exe文件…“

https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation