从多个并行子目录导入模块 (Python)
Importing Modules from Multiple Parallel Subdirectories (Python)
python 相对较新,我在工作中将其用于实验室设备自动化。
我在目录 B 中有一个脚本。目录 B 的父目录是目录 A。目录 A 包含另一个目录,我需要从中输入和导入模块。结构如下所示:
A
B C
myscript.py
E F
m1.py m2.py
我需要将 m1.py 和 m2.py 导入到我的脚本中。我无法将上面的脚本移动到 A 目录中,因为它正在访问我编写并转储到 B 中的一堆其他模块。出于公司特定的原因,我需要维护包括目录 C 和目录 C 以下的所有内容的目录结构(不要得到我开始了。)
我的问题是,我该如何智能地导入这些?我不想对它们的路径进行硬编码,因为它们将存在于 SVN 中并且根目录可能会改变。我正在考虑使用循环来扫描?我只是不熟悉使这成为可能的语法。欢迎所有解决方案!
最好在 Python 中显式导入并注意目录结构。如果结构发生变化,您的导入也应该发生变化。
只要您的项目在 python 路径上,您应该能够从驻留在 B
或层次结构中其他任何位置的模块执行此操作:
from Project.A.B import myscript
from Project.A.C.E import m1
from Project.A.C.F import m2
如果目录结构始终相同,您可以尝试导入 m1.py
和 m2.py
,方法是将 C
的路径附加到 sys.path
中 myscript.py
.
您还可以通过使用 os.path.dirname
and os.path.join
and os.path.abspath
和变量 - __file__
等 os.path
方法从 B
相对获取 C
的路径。
例子-
import os.path
import sys
curdir = os.path.dirname(__file__)
cdir = os.path.abspath(os.path.join(curdir,'../C'))
sys.path.append(cdir)
import m1,m2
我有以下文件设置:
A
├── B
│ ├── __init__.py
│ └── myscript.py
└── C
├── E
│ ├── __init__.py
│ └── m1.py
├── F
│ ├── __init__.py
│ └── m2.py
└── __init__.py
代码:
A/C/E/m1.py
def my_func1():
print 'func1'
A/C/F/m2.py
def my_func2():
print 'func2'
A/B/myscript.py
from C.E.m1 import my_func1
from C.F.m2 import my_func2
my_func1()
my_func2()
或者,如果您的导入目录名称具有 space(例如,C dir
而不是 C
):
import importlib
m1 = importlib.import_module("C dir.E.m1")
m2 = importlib.import_module("C dir.F.m2")
m1.my_func1()
m2.my_func2()
所有 __init__.py
文件都是空的,但需要存在,因此 Python 知道在这些文件夹中查找代码。
cd
到 A
目录,然后 运行 脚本作为一个包。注意:没有.py
和文件名结尾
$ python -m B.myscript
输出:
func1
func2
python 相对较新,我在工作中将其用于实验室设备自动化。
我在目录 B 中有一个脚本。目录 B 的父目录是目录 A。目录 A 包含另一个目录,我需要从中输入和导入模块。结构如下所示:
A
B C
myscript.py
E F
m1.py m2.py
我需要将 m1.py 和 m2.py 导入到我的脚本中。我无法将上面的脚本移动到 A 目录中,因为它正在访问我编写并转储到 B 中的一堆其他模块。出于公司特定的原因,我需要维护包括目录 C 和目录 C 以下的所有内容的目录结构(不要得到我开始了。)
我的问题是,我该如何智能地导入这些?我不想对它们的路径进行硬编码,因为它们将存在于 SVN 中并且根目录可能会改变。我正在考虑使用循环来扫描?我只是不熟悉使这成为可能的语法。欢迎所有解决方案!
最好在 Python 中显式导入并注意目录结构。如果结构发生变化,您的导入也应该发生变化。
只要您的项目在 python 路径上,您应该能够从驻留在 B
或层次结构中其他任何位置的模块执行此操作:
from Project.A.B import myscript
from Project.A.C.E import m1
from Project.A.C.F import m2
如果目录结构始终相同,您可以尝试导入 m1.py
和 m2.py
,方法是将 C
的路径附加到 sys.path
中 myscript.py
.
您还可以通过使用 os.path.dirname
and os.path.join
and os.path.abspath
和变量 - __file__
等 os.path
方法从 B
相对获取 C
的路径。
例子-
import os.path
import sys
curdir = os.path.dirname(__file__)
cdir = os.path.abspath(os.path.join(curdir,'../C'))
sys.path.append(cdir)
import m1,m2
我有以下文件设置:
A
├── B
│ ├── __init__.py
│ └── myscript.py
└── C
├── E
│ ├── __init__.py
│ └── m1.py
├── F
│ ├── __init__.py
│ └── m2.py
└── __init__.py
代码:
A/C/E/m1.py
def my_func1():
print 'func1'
A/C/F/m2.py
def my_func2():
print 'func2'
A/B/myscript.py
from C.E.m1 import my_func1
from C.F.m2 import my_func2
my_func1()
my_func2()
或者,如果您的导入目录名称具有 space(例如,C dir
而不是 C
):
import importlib
m1 = importlib.import_module("C dir.E.m1")
m2 = importlib.import_module("C dir.F.m2")
m1.my_func1()
m2.my_func2()
所有 __init__.py
文件都是空的,但需要存在,因此 Python 知道在这些文件夹中查找代码。
cd
到 A
目录,然后 运行 脚本作为一个包。注意:没有.py
和文件名结尾
$ python -m B.myscript
输出:
func1
func2