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

8 浏览
0 Comments

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

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

import foobar

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

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

更新2:我将选择下面提到的符号链接解决方案。

0
0 Comments

在Python中,通常我们可以使用import语句来导入一个模块。但是,当我们尝试导入一个没有.py扩展名的Python模块时,会出现问题。这是因为Python的导入机制默认会根据文件的扩展名来确定文件的类型,从而选择适当的加载器进行加载。然而,对于没有.py扩展名的文件,Python无法确定它的类型,因此无法正确加载。

为了解决这个问题,我们可以使用importlib.util模块中的spec_from_loader函数和importlib.machinery模块中的SourceFileLoader类。通过显式地指定SourceFileLoader加载器,我们可以强制导入机制将文件作为源代码加载,而不是根据扩展名确定文件类型。这样,即使文件没有在importlib.machinery.SOURCE_SUFFIXES中列出,我们仍然可以成功地导入文件。

下面是解决该问题的示例代码:

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)

如果我们希望在第一次加载后继续通过名称导入文件,我们可以将模块添加到sys.modules中:

sys.modules['foobar'] = foobar

另外,我们还可以使用一个名为haggis的实用库中的load_module函数来实现这个功能。load_module函数提供了将模块添加到sys.modules、设置自定义名称以及向代码的命名空间中注入变量的选项。

如果我们想要使用import *来导入模块的所有内容,可以使用globals().update(foobar.__dict__)来实现。然而,建议不要过度使用import *,因为这可能导致命名空间污染和不可预测的行为。

总之,通过使用importlib.util和importlib.machinery模块中的函数和类,我们可以成功地导入没有.py扩展名的Python模块,从而解决了这个问题。如果需要更多的功能和选项,可以考虑使用haggis库提供的load_module函数。

0
0 Comments

在Python中,通常使用import语句来导入一个模块。但是,当导入一个没有.py扩展名的Python模块时,会出现问题。那么,为什么会出现这个问题以及如何解决呢?

问题的原因是Python默认只能导入带有.py扩展名的模块文件。当我们尝试导入没有.py扩展名的文件时,Python会报错。为了解决这个问题,我们可以使用imp.load_source函数来动态地从指定的文件系统路径加载一个模块。

下面是解决这个问题的代码示例:

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

这段代码中,我们使用imp.load_source函数来加载一个名为'foobar'的模块,该模块位于指定的文件系统路径'/path/to/foobar'下。

此外,你还可以参考一个Stack Overflow讨论中提到的一些有趣的选项。

在代码中,我们还可以看到一个关于参数'foobar'的问题。实际上,这个参数用来设置模块的__name__属性。通常情况下,__name__属性是根据文件名来确定的。但是,由于我们使用的是一个非标准的文件名(可能甚至不包含任何有效的Python标识符),所以我们必须明确指定模块的名称。至于你存储创建的模块对象的变量名,是无关紧要的。就像你可以使用import foo.bar as baz来引用一个模块,变量baz引用的模块仍然具有原始的__name__属性。

然而,从Python 3.4开始,imp.load_source函数已经被弃用。那么,在Python 3.4及以上版本中,如何导入没有.py扩展名的文件呢?

对于Python 3.4及以上版本,我们可以使用以下方法来导入没有.py扩展名的文件:

import importlib.util
spec = importlib.util.spec_from_file_location('foobar', '/path/to/foobar')
foobar = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foobar)

以上就是关于如何导入没有.py扩展名的Python模块的问题的原因和解决方法。希望对你有所帮助!

0
0 Comments

问题的原因是希望在Python中导入一个没有.py扩展名的模块。通常,这种情况下不想使用.py扩展名的原因是因为Python脚本同时也作为可执行文件运行,但仍希望其他模块能够导入它。为了解决这个问题,可以将功能移到一个具有类似名称的.py文件中,然后使用foobar作为一个包装器。或者,可以将foobar.py创建一个符号链接到foobar(假设不在Windows上),这样更加清晰。在Windows上可以使用.bat文件来实现相同的效果。

另一个问题是,如果只复制包装器到bin/目录中,那么当从路径中运行程序时,程序将无法正常工作。

0