python - 使用 import_module 从不同目录导入模块
问题描述
我在一个目录中有一个模块,需要由另一个目录中的脚本导入。但是,每当我尝试导入它时,我都会得到一个ModuleNotFoundError
. 由于位于单独的 git repos 中,我必须将它们保存在单独的目录中。这是我的文件结构的示例:
└─ Documents
├─ ModuleRepo
│ └─ myModule.py
└─ ScriptRepo
└─ myScript.py
该脚本myScript.py
将模块名称作为命令行参数,然后使用以下命令导入它:
import importlib
def dynamic_import(module):
return importlib.import_module(module)
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('modulename', help='Specify the module to import', type=str)
args = parser.parse_args()
mymodule = dynamic_import(args.modulename)
如果我导航到Documents/ModuleRepo
并尝试运行python3 ../ScriptRepo/myScript.py myModule
,则会出现错误ModuleNotFoundError: No module named 'myModule'
。如果我myModule.py
进入Documents/ScriptRepo
,那么它会成功运行 - 所以我猜 python 只在正在运行的脚本的目录中寻找模块。这对我来说特别奇怪,因为这个确切的设置几个月前对我有用,但现在似乎没有。
我的最小目标是能够导航到Documents/ModuleRepo
并运行python3 ../ScriptRepo/myScript.py myModule
. 理想情况下(但不一定),我希望能够从任何地方运行,使用到和myScript.py
的相对路径。myScript.py
myModule.py
我已经浏览了许多关于使用 动态导入的现有问题importlib
,甚至在今年早些时候问过我自己的一个问题,但我仍然不知道如何解决将模块放在完全独立的目录中的问题。所以任何帮助将不胜感激。
解决方案
以下代码片段将允许您通过显式定义所需模块的路径来加载模块:
对于 Python 3.5+ 使用:
import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()
对于 Python 3.3 和 3.4,请使用:
from importlib.machinery import SourceFileLoader
foo = SourceFileLoader("module.name", "/path/to/file.py").load_module()
foo.MyClass()
(尽管这在 Python 3.4 中已被弃用。)
对于 Python 2 使用:
import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()
推荐阅读
- reactjs - 尝试使用大量 [object, Object] 在 react native 上显示带有 flatlist 的卡片
- app-inventor - 为什么我不能构建以前使用 MIT App Inventor 构建的相同应用程序?
- sql - 在两个日期 BigQuery 之间的每一天重复记录?
- reactjs - 即使容器可以很好地设置任何其他属性,我也无法找到一种方法来设置容器中列表元素的键
- sql - 异常处理触发器导致错误 ORA-06512: 执行触发器期间出错
- wordpress - 如何从这个 wordpress 功能中排除登录用户?
- google-app-engine - 谷歌应用引擎部署使用错误的服务帐户?
- web-applications - 如何在没有服务人员的情况下使缓存的网站脱机工作?
- c# - MySQL触发器+插入
- python - 使用 csv 文件时无法将字符串转换为浮点错误