如何导入给定相对路径的Python模块?
例如,如果dirFoo包含Foo.py和dirBar,而dirBar包含Bar.py,我如何将Bar.py导入Foo.py?
下面是一个视觉表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Foo希望包含Bar,但重组文件夹层次结构不是一个选项。
如何导入给定相对路径的Python模块?
例如,如果dirFoo包含Foo.py和dirBar,而dirBar包含Bar.py,我如何将Bar.py导入Foo.py?
下面是一个视觉表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Foo希望包含Bar,但重组文件夹层次结构不是一个选项。
当前回答
嗯,正如您所提到的,通常您希望能够访问与主脚本运行位置相关的模块文件夹,因此只需导入它们。
解决方案:
我有D:/Books/MyBooks.py中的脚本和一些模块(如oldies.py)。我需要从子目录D:/Books/includes导入:
import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path) # Just verify it is there
import oldies
在oldies.py中放置一个打印(“done”),这样您就可以验证一切正常。这种方式总是有效的,因为根据程序启动时初始化的Python定义sys.path,此列表的第一项路径[0]是包含用于调用Python解释器的脚本的目录。
如果脚本目录不可用(例如,如果以交互方式调用解释器或从标准输入读取脚本),则路径[0]是空字符串,它指示Python首先搜索当前目录中的模块。请注意,脚本目录是在PYTHONPATH插入的条目之前插入的。
其他回答
我对python没有经验,所以如果我的话有任何错误,请告诉我。如果您的文件层次结构是这样安排的:
project\
module_1.py
module_2.py
module_1.py定义了一个名为func_1()的函数,module_2.py:
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
如果在cmd中运行python module_2.py,它将运行func1()定义的内容。这通常是我们导入相同层次结构文件的方式。但当您从module_2.py中的.module_1 import func_1写入时,python解释器将显示No module named'__main__.module_1';'__main__'不是包。因此,为了解决这个问题,我们只需保留刚才所做的更改,并将两个模块移动到一个包中,然后将第三个模块作为调用方运行module_2.py。
project\
package_1\
module_1.py
module_2.py
main.py
main.py:
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
但我们添加一个。在module_2.py中的module_1之前,如果我们不这样做并运行main.py,python解释器会说没有名为“module_1”的模块,这有点棘手,module_1.py就在module_.py旁边。现在我让module_1.y中的func_1()做一些事情:
def func_1():
print(__name__)
__name__记录谁调用func_1。现在我们保留。在module1之前,运行main.py,它将打印package1.module1,而不是module1。它表示调用func_1()的人与main.py位于同一层次结构中。暗示module1与module2.py本身处于同一层次结构。因此,如果没有点,main.py将在与自身相同的层次结构中识别模块_1,它可以识别package_1,但不能识别其下的内容。
现在让我们把它弄得有点复杂。您有一个config.ini,一个模块定义了一个函数,以便在与“main.py”相同的层次结构中读取它。
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
由于某些不可避免的原因,您必须使用module_2.py调用它,因此它必须从上层导入module_2.py:
import ..config
pass
两个点表示从上层导入(三个点访问上层,而不是上层,依此类推)。现在我们运行main.py,解释器会说:ValueError:试图在顶级包之外进行相对导入。这里的“顶级包”是main.py。正因为config.py在main.py的旁边,所以它们处于相同的层次结构中,config.py不是“在”main.py之下,或者它不是由main.py“引导”的,所以它超出了main.py之外。要解决这个问题,最简单的方法是:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
我认为这符合排列项目文件层次结构的原则,您应该在不同的文件夹中排列具有不同功能的模块,只需在外部保留一个顶级调用程序,您就可以随意导入。
另一个解决方案是安装py-require包,然后在Foo.py中使用以下内容
import require
Bar = require('./dirBar/Bar')
只需使用:从Desktop.filename导入一些内容
例子:
给定目录中的文件名为test.py用户/用户/桌面,并将导入所有内容。
代码:
from Desktop.test import *
但请确保在该目录中创建一个名为“__init__.py”的空文件
以下是使用相对路径从上面的一个级别导入文件的方法。
基本上,只需将工作目录向上移动一个级别(或任何相对位置),将其添加到路径中,然后将工作目录移回其起始位置。
#to import from one level above:
cwd = os.getcwd()
os.chdir("..")
below_path = os.getcwd()
sys.path.append(below_path)
os.chdir(cwd)
相对sys.path示例:
# /lib/my_module.py
# /src/test.py
if __name__ == '__main__' and __package__ is None:
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
import my_module
基于这个答案。