我遇到导入问题。我想做的是从具有相同名称的模块中导入具有相同名称的2个函数。请注意,我正在Pycharm中进行此操作。
我具有以下目录结构:
test_import
|--foo.py
|--main.py
|--test
|--foo.py
代码
test_import文件夹中的 foo.py
如下:
def print_arg(x):
print('print 1: {}'.format(x))
测试文件夹中的 foo.py
如下:
def print_arg(x):
print('print 2: {}'.format(x))
这是我在main.py
中导入print_arg
的代码:
import sys
from foo import print_arg as print_arg
print_arg(1)
sys.path.insert(1, './test')
from foo import print_arg as print_arg_2
print_arg(1)
print_arg_2(1)
我希望可以打印
print 1: 1
print 1: 1
print 2: 1
但是可以打印
print 1: 1
print 1: 1
print 1: 1
以某种方式第二次导入不起作用,并且print_arg_2
成为对print_arg
的引用。可以通过相反的方式进行导入来说明这一点:
sys.path.insert(1, './test')
from foo import print_arg as print_arg_2
print_arg_2(1)
sys.path.pop(1)
from foo import print_arg
print_arg(1)
print_arg(1)
print_arg_2(1)
打印:
print 2: 1
print 2: 1
print 2: 1
将test / foo.py中的函数名称更改为print_arg_2
不起作用,这将导致错误。似乎已在项目文件夹中创建对foo.py
的引用,并且它尝试从那里导入,而不是在sys.path
上查找其他目录
Traceback (most recent call last):
File "C:\Users\jeroe\AppData\Local\Programs\Python\Python37\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-2-10fe80aec78f>", line 5, in <module>
from foo import print_arg_2 as print_arg_2
ImportError: cannot import name 'print_arg_2' from 'foo' (C:\Users\jeroe\PycharmProjects\test_import\foo.py)
将测试文件夹中foo.py
的文件名更改为例如foo2.py
确实有效。但是,我不想更改文件名。
所以我有2个问题:
有人可以解释一下这是怎么回事吗?
在不更改文件(模块)名称的情况下导入这两个函数的更好方法是什么?
答案 0 :(得分:1)
首先,您必须在测试文件夹中添加一个空的__init__.py
文件,以便可以导入第二个foo文件。
第二,导入时必须将完整的相对路径写入第二个文件。现在,您正在两次导入第一个foo文件。
只需将第二个导入行修改为:
from test.foo import print_arg as print_arg_2