相对较新的python,我将它用于工作中的实验室设备自动化。
我有一个脚本存在于目录B中。目录B的父目录是目录A.目录A包含另一个我需要输入和导入模块的目录。结构如下所示:
A
B C
myscript.py
E F
m1.py m2.py
我需要将m1.py和m2.py导入我的脚本。我无法将我的脚本移到A目录中,因为它访问了我编写并在B中转储的一堆其他模块。我需要维护包括和在目录C下面的所有内容的目录结构,以满足公司特定的原因(不要让我开始。)
我的问题是,如何智能地导入这些?我不想对其路径进行硬编码,因为它们将存在于SVN中,并且根目录可能会发生变化。我正在考虑使用循环扫描?我只是不熟悉使这成为可能的语法。欢迎所有解决方案!
答案 0 :(得分:3)
我有以下文件设置:
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()
或者,如果您的导入目录名称有空格(例如,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
答案 1 :(得分:1)
如果目录结构始终相同,您可以尝试导入m1.py
和m2.py
,方法是将C
的路径添加到sys.path
myscript.py
中}。
您还可以使用os.path.dirname
和os.path.join
以及os.path.abspath
等C
方法,从B
相对获取os.path
的路径变量 - __file__
。
示例 -
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
答案 2 :(得分:0)
更好的做法是在Python中显式导入并注意目录结构。如果结构发生变化,您的导入应该会改变。
只要您的项目位于python路径上,您就应该能够从位于B
的模块或层次结构中的任何其他位置执行此操作:
from Project.A.B import myscript
from Project.A.C.E import m1
from Project.A.C.F import m2