Python 3.4:如何根据完整路径导入一个模块?

9 浏览
0 Comments

Python 3.4:如何根据完整路径导入一个模块?

如何在Python 3.4中通过完整路径加载一个Python模块?一个类似的问题How to import a module given the full path?涵盖了Python 3.4之前的版本,但是得出的结论是对于所给出的答案,Python 3.4的支持已经被弃用,因此对于Python 3.4的任何解决方案都是可行的。

请注意,该问题不是Import abitrary python source file. (Python 3.3+)的重复,因为该问题的答案也使用了在Python 3.4中被弃用的loader.load_module(),如答案所述,并在Consider leaving importlib.abc.Loader.load_module()中提供了详细信息,文档中有importlib的说明。

因此,需要一个在Python 3.4中支持通过完整路径导入模块的解决方案。

0
0 Comments

问题的出现原因是在Python 3.6之前的版本中,使用`imp.load_module`函数来导入模块已经被弃用,因此需要找到替代的方法来导入具有完整路径的模块。

解决方法是使用`importlib.machinery.SourceFileLoader`来导入模块。通过以下代码可以导入具有完整路径的模块:

import importlib.machinery
modulename = importlib.machinery.SourceFileLoader('modulename','/Path/To/module.py').load_module()

这种方法在Python 3.4中得到了完全支持,并且可以适用于所有的Python文件,无论其文件扩展名是什么。

需要注意的是,在Python 3.6版本之后,推荐使用`importlib.abc.Loader.exec_module()`函数来代替`imp.load_module`函数。这是因为在Python 3.6中,`imp`模块已经被`importlib`模块取代,具体的用法可以参考官方文档中的说明。

此外,对于C/C++扩展模块,可以使用`importlib.machinery.ExtensionFileLoader`来导入。

0
0 Comments

Python 3.4: 如何根据完整路径导入一个模块?

问题的出现原因是:在Python 3.4中,没有提供一个简单的方法来根据完整路径导入一个模块。现有的解决方法使用了一些复杂的步骤,使得代码变得冗长。

解决方法如下:

import sys, os, importlib
sys.path.append(os.path.dirname(filename))
mname = os.path.splitext(os.path.basename(filename))[0]
imported = importlib.import_module(mname)                       
sys.path.pop()

其中,`filename`是要导入的模块的完整路径。通过将路径添加到`sys.path`中,然后使用`importlib.import_module`函数导入模块。导入后,可以像正常导入模块一样使用`imported.method(arg)`调用模块中的方法。

最后一行代码`sys.path.pop()`并不是必需的,但是为了保持`sys.path`中不包含不必要的条目(特别是如果要多次运行代码),最好将其删除。

然而,这种方法并不适用于所有情况。如果`mname`的值与Python标准库中的模块名称重复,那么代码将导入Python标准库中的模块,而不是指定的模块。例如,如果`mname`为"/my/own/dir/stat.py",那么代码将导入名为`stat`的Python标准库模块,而不是指定的模块。

为了解决这个问题,可以尝试将路径插入到`sys.path`的开头,而不是末尾,例如使用`sys.path.insert(0, os.path.dirname(filename))`。这样做的话,需要在导入模块后使用`sys.path.pop(0)`将其移除。当然,如果这样做的话,更重要的是要删除该条目,以防止该目录中的文件覆盖标准库。

另外,要注意在使用`sys.path.pop()`或`sys.path.pop(0)`之前,需要确保`sys.path`没有被导入的模块修改过。为了避免这个问题,可以使用`sys.remove(os.path.dirname(filename))`来删除路径。

总之,Python 3.4中没有直接的方法来根据完整路径导入一个模块,但是可以通过添加路径到`sys.path`并使用`importlib.import_module`函数来实现。然而,需要注意路径命名与标准库模块名称的冲突,并在导入模块后删除不必要的路径条目。

0
0 Comments

问题的原因是在Python 3.4中,没有直接导入给定完整路径的模块的方法。解决方法是使用importlib库中的util模块来实现。

具体的解决方法是创建一个import_file函数,该函数接受完整模块名和路径作为参数,并返回导入的模块。在函数体内部,首先导入importlib中的util模块。然后使用util.spec_from_file_location函数创建一个模块规范(spec),该规范指定了模块的名称和路径。接下来使用util.module_from_spec函数根据规范创建一个模块对象(mod)。最后使用spec.loader.exec_module函数执行模块并返回。

需要注意的是,module_from_spec函数只在Python 3.5及更高版本中可用。因此,这种解决方法只适用于Python 3.5及更高版本的环境中。

以上就是解决Python 3.4中如何导入给定完整路径的模块的方法。通过使用importlib库中的util模块,我们可以实现在Python 3.4中导入给定完整路径的模块的功能。

0