如何在给定相对路径的情况下导入Python模块?

例如,如果dirFoo包含Foo.pydirBar,而dirBar包含Bar.py,那么如何将Bar.py导入Foo.py

这是一个视觉表现:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo希望包含Bar个,但重组文件夹层次结构不是一个选项.

推荐答案

假设您的两个目录都是真正的Python包(其中确实有__init__.py个文件),这里有一个相对于脚本位置包含模块的安全解决方案.

我假设您想要这样做,因为您需要在脚本中包含一组模块.我在多个产品的生产中使用了这一点,并在许多特殊场景中工作,比如:从另一个目录调用脚本,或者使用python execute执行脚本,而不是打开新的解释器.

 import os, sys, inspect
 # realpath() will make your script run, even if you symlink it :)
 cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
 if cmd_folder not in sys.path:
     sys.path.insert(0, cmd_folder)

 # Use this if you want to include modules from a subfolder
 cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"subfolder")))
 if cmd_subfolder not in sys.path:
     sys.path.insert(0, cmd_subfolder)

 # Info:
 # cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
 # __file__ fails if the script is called in different ways on Windows.
 # __file__ fails if someone does os.chdir() before.
 # sys.argv[0] also fails, because it doesn't not always contains the path.

作为奖励,这种方法确实允许您强制Python使用您的模块,而不是系统上安装的模块.

警告!当当前模块在一个egg文件中时,我真的不知道会发生什么.它可能也会失败.

Python相关问答推荐

Python计算目录及其所有子目录中的文件

是否有用于表示数据增量的标准算法或库?

带有过滤条件的Pandas 滚动窗口以删除一些最新数据

如何将 5 个数字映射到 5 种不同的 colored颜色

在 Python3 中将非整数成员值添加到 IntEnum

我在其中 1 列中有一个带有 json 子字符串的数据框.我想提取变量并为它们制作列

基于布尔值 pandas df 的高亮元素

如何将对称矩阵转换为邻接表

通过变量名从recarray中删除变量

如何向输入字典添加别名?

根据分组列向包含特定列的比例的Pandas 数据框添加一列

如何使用 sys.argv 将字符串变量从 shell 脚本传递给 python?

将命令添加到用户输入

Python:为什么 pip install 不从 sdist 部署我的代码?

计算频率数据帧的众数、中位数和偏度

过滤一行代码,只显示某些列

获取目录中所有文件名的列表及其原始文件夹顺序

Pytesseract image_to_data 无法读取我图像中的数字

如何将过滤的分组聚合的结果分配为原始 Pandas DataFrame 中的新列

使用 Python OpenCV cv2.VideoCapture() 直接以灰度读取视频帧