如何从 2 个 python 同名文件中加载 2 个同名函数?
How to load 2 functions with the same name from 2 python files with the same name?
我遇到导入问题。我想要做的是从具有相同名称的模块中导入 2 个具有相同名称的函数。请注意,我在 Pycharm.
中执行此操作
我的目录结构如下:
test_import
|--foo.py
|--main.py
|--test
|--foo.py
代码
foo.py
在 test_import 文件夹中看起来像:
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 个函数的更好方法是什么?
首先,您必须在测试文件夹中添加一个空的 __init__.py
文件,以便可以导入第二个 foo 文件。
其次,导入第二个文件时,必须写下完整的相对路径。现在,您正在导入第一个 foo 文件。
只需将第二个导入行修改为:
from test.foo import print_arg as print_arg_2
我遇到导入问题。我想要做的是从具有相同名称的模块中导入 2 个具有相同名称的函数。请注意,我在 Pycharm.
中执行此操作我的目录结构如下:
test_import
|--foo.py
|--main.py
|--test
|--foo.py
代码
foo.py
在 test_import 文件夹中看起来像:
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 个函数的更好方法是什么?
首先,您必须在测试文件夹中添加一个空的 __init__.py
文件,以便可以导入第二个 foo 文件。
其次,导入第二个文件时,必须写下完整的相对路径。现在,您正在导入第一个 foo 文件。
只需将第二个导入行修改为:
from test.foo import print_arg as print_arg_2