我有一个python项目,需要能够运行外部脚本。
这些脚本在具有多个模块的目录结构中动态导入。
现在,由于这些脚本是独立编写的,并且彼此不了解,因此它们通常使用相同的模块名称。
这使我在逐个导入它时会出现问题。
例如,这是我的目录结构:
所以我在根文件夹中有一个main.py脚本,在a和b文件夹中有两个“外部”脚本。
两个脚本都使用不同的utils.py模块。
a / a.py的内容:
import utils
utils.hello()
/ utils.py的内容:
def hello():
print 'hello from a'
b / b.py的内容:
import utils
utils.hello()
b / utils.py的内容:
def hello():
print 'hello from b'
main.py的内容
import sys
sys.path.append('a')
import a
sys.path.append('b')
import b
现在,此示例打印:
hello from a
hello from a
我显然需要打印:
hello from a
hello from b
由于我不负责“外部”脚本,我无法修改它们,有什么方法可以实现这个目标吗?
修改
使用@ moinuddin-quadri导入的答案如下:从导入中确实适用于这个简单的例子,但是这个:
每个utils.py正在做的事情:
来自lib2 import utils2
为此,我需要将根脚本文件夹放在sys.path
上当b / lib / utils尝试运行时:从lib2 import utils2,它在/ lib2中接收utils2
答案 0 :(得分:2)
您应该在 a.py 和 b.py 中使用相对导入。所以,你的导入应该是:
from . import utils
表示来自当前目录的,导入工具。这样你就可以让你的python程序在 a / a.py 中导入 a / utils.py 并在 b / utils.py > b / b.py
首先在__init__.py
的目录中创建main.py
(假设__init__.py
和a
中已存在b
),然后导入a和b in main.py as:
from a import a # No need to do `sys.path.append('a')`
from b import b
# For importing utils.py (if needed)
from a import utils as a_utils
a_utils.hello()
from b import utils as b_utils
b_utils.hello()
同时阅读:
答案 1 :(得分:0)
通常,要导入模块,我们不需要使用sys.path:
<强> main.py 强>
from a import a
# first 'a' is the directory. second 'a' is a.py
# the 'a' directory needs to have __init__.py which can be blank
from b import b
<强>一个/ a.py 强>
from . import utils
<强> B / b.py 强>
from . import utils
由于无法修改外部模块,因此可以在导入模块时重命名具有相同名称的模块:
<强> main.py 强>
from a import utils as utils_a
from b import utils as utils_b
utils_a.hello()
utils_b.hello()