如何从 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 确实有效。但是我不想更改文件名。

所以我有两个问题:

  1. 谁能给我解释一下这是怎么回事?

  2. 在不更改文件(模块)名称的情况下导入这 2 个函数的更好方法是什么?

首先,您必须在测试文件夹中添加一个空的 __init__.py 文件,以便可以导入第二个 foo 文件。

其次,导入第二个文件时,必须写下完整的相对路径。现在,您正在导入第一个 foo 文件。

只需将第二个导入行修改为:

from test.foo import print_arg as print_arg_2