带有“当前目录”导入的导入模块

帕斯卡·科腾

我有以下代码可以动态加载模块:

def load_module(absolute_path):
    import importlib.util
    module_name, _ = os.path.splitext(os.path.split(absolute_path)[-1])
    try:
        py_mod = imp.load_source(module_name, absolute_path)
    except ImportError:
        module_root = os.path.dirname(absolute_path)
        print("Could not directly load module, including dir: {}".format(module_root))
        spec = importlib.util.spec_from_file_location(
            module_name, absolute_path, submodule_search_locations=[module_root, "."])
        py_mod = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(py_mod)
    return py_mod

它确实工作得很好,除了尝试在同一文件夹(而不是具有相同名称的程序包的一部分)中导入脚本的情况外。例如,脚本a.py正在执行import b这会导致错误ImportError: No module named 'b'(这是Python 3常见的错误)。

但是我真的很想找到一种解决方法吗?可以通过以下方式解决:

import sys
sys.path.append(".")

编写“ a”脚本。

尽管我希望可以通过以下方式解决此问题:

submodule_search_locations=[module_root, "."]

哦,是的,原因是我还想支持导入不是正确的程序包/模块的模块,而只是支持某些可以在解释器中使用的脚本。

可复制的代码

〜/ example / a.py

import b

〜/ example / b.py

print("hi")

〜/ somewhere_else / main.py(与a / b不同)

import sys, os, imp, importlib.util

def load_module(absolute_path) ...

load_module(sys.argv[1])

然后在命令行上运行:

cd ~/somewhere_else
python3.5 main.py /home/me/example/a.py

导致 ImportError: No module named 'b'

以下代码可以解决该问题,但是我们当然不能sys.path在所有脚本中手动放置内容。

〜/ example / a.py(2)

import sys
sys.path.append(".")
import b

我真的希望其他人可能有一个我尚未想到的解决方案。

附录

def load_module(absolute_path):
    import importlib.util
    module_name, _ = os.path.splitext(os.path.split(absolute_path)[-1])
    try:
        py_mod = imp.load_source(module_name, absolute_path)
    except ImportError as e:
        if "No module named" not in e.msg:
            raise e

        missing_module = e.name
        module_root = os.path.dirname(absolute_path)

        if missing_module + ".py" not in os.listdir(module_root):
            msg = "Could not find '{}' in '{}'"
            raise ImportError(msg.format(missing_module, module_root))

        print("Could not directly load module, including dir: {}".format(module_root))
        sys.path.append(module_root)
        spec = importlib.util.spec_from_file_location(module_name, absolute_path)
        py_mod = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(py_mod)
    return py_mod
马丁·彼得斯(Martijn Pieters)

您在这里使用动态导入并没有关系;同样的问题也适用于任何假设当前目录位于路径中的代码。这些脚本负责确保当前目录位于路径本身上。

而不是使用'.'(当前工作目录),而是使用__file__全局将目录添加到路径:

import os.path
import sys

HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE)

可以通过添加重试您的动态导入os.path.dirname(absolute_path)sys.path当你有一个ImportError(也许检测,这是一个短暂的导入失败),但是这是一个巨大的飞跃,使你不能缺少的依赖,并作出有关的假设一个模块之间的区别sys.path

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有“当前目录”导入的导入模块

来自分类Dev

从当前工作目录上方的目录导入模块

来自分类Dev

Python:导入带有参数的模块?

来自分类Dev

在python中导入带有参数的模块

来自分类Dev

带有iis导入模块的Python

来自分类Dev

带有子模块导入的名称空间

来自分类Dev

Python:导入带有参数的模块?

来自分类Dev

带有 Executionpolicy RemoteSigned 的导入模块 PoshRSJob

来自分类Dev

在目录之间导入模块

来自分类Dev

在当前工作目录中导入模块

来自分类Dev

从当前工作目录相对导入python模块

来自分类Dev

svn导入到当前目录(没有file:///或http:///)

来自分类Dev

Python从并行目录导入模块

来自分类Dev

从父目录导入XQuery模块

来自分类Dev

导入错误:没有带有 sudo 的名为 pyaudio 的模块

来自分类Dev

如何导入带有虚线路径的模块?

来自分类Dev

如何使用@testable导入带有空格的模块

来自分类Dev

导入带有C绑定的代码的Pickle模块

来自分类Dev

如何导入带有虚线路径的模块?

来自分类Dev

导入问题 Python3:从带有 api 模块的烧瓶项目的包导入

来自分类Dev

当我尝试导入当前工作目录中的模块时引发ModuleNotFoundError

来自分类Dev

Jupyter Notebook如何导入不在当前工作目录中的模块?

来自分类Dev

模块导入失败,除非在当前目录中 - Python3

来自分类Dev

如何将带有模块的目录导入到Python路径,该目录是从子文件夹到原始源的符号链接?

来自分类Dev

导入与当前模块同名的python标准库

来自分类Dev

导入与当前模块同名的python标准库

来自分类Dev

流星:导入目录-模块化导入所需的方法

来自分类Dev

理解从目录导入模块的 React.js 导入语句

来自分类Dev

从python Django中的导入模块中导入当前模块(导入循环)

Related 相关文章

  1. 1

    带有“当前目录”导入的导入模块

  2. 2

    从当前工作目录上方的目录导入模块

  3. 3

    Python:导入带有参数的模块?

  4. 4

    在python中导入带有参数的模块

  5. 5

    带有iis导入模块的Python

  6. 6

    带有子模块导入的名称空间

  7. 7

    Python:导入带有参数的模块?

  8. 8

    带有 Executionpolicy RemoteSigned 的导入模块 PoshRSJob

  9. 9

    在目录之间导入模块

  10. 10

    在当前工作目录中导入模块

  11. 11

    从当前工作目录相对导入python模块

  12. 12

    svn导入到当前目录(没有file:///或http:///)

  13. 13

    Python从并行目录导入模块

  14. 14

    从父目录导入XQuery模块

  15. 15

    导入错误:没有带有 sudo 的名为 pyaudio 的模块

  16. 16

    如何导入带有虚线路径的模块?

  17. 17

    如何使用@testable导入带有空格的模块

  18. 18

    导入带有C绑定的代码的Pickle模块

  19. 19

    如何导入带有虚线路径的模块?

  20. 20

    导入问题 Python3:从带有 api 模块的烧瓶项目的包导入

  21. 21

    当我尝试导入当前工作目录中的模块时引发ModuleNotFoundError

  22. 22

    Jupyter Notebook如何导入不在当前工作目录中的模块?

  23. 23

    模块导入失败,除非在当前目录中 - Python3

  24. 24

    如何将带有模块的目录导入到Python路径,该目录是从子文件夹到原始源的符号链接?

  25. 25

    导入与当前模块同名的python标准库

  26. 26

    导入与当前模块同名的python标准库

  27. 27

    流星:导入目录-模块化导入所需的方法

  28. 28

    理解从目录导入模块的 React.js 导入语句

  29. 29

    从python Django中的导入模块中导入当前模块(导入循环)

热门标签

归档