如何从两个同名python文件中加载两个同名函数?

如何从两个同名python文件中加载两个同名函数?,python,python-import,Python,Python Import,我有进口问题。我试图做的是从具有相同名称的模块中导入两个具有相同名称的函数。请注意,我是在Pycharm中这样做的 我有以下目录结构: test_import |--foo.py |--main.py |--test |--foo.py 代码 test\u import文件夹中的foo.py如下所示: def print_arg(x): print('print 1: {}'.format(x)) def print_arg(x): print('prin

我有进口问题。我试图做的是从具有相同名称的模块中导入两个具有相同名称的函数。请注意,我是在Pycharm中这样做的

我有以下目录结构:

test_import 
|--foo.py  
|--main.py  
|--test
   |--foo.py  
代码

test\u import文件夹中的
foo.py
如下所示:

def print_arg(x):
    print('print 1: {}'.format(x))
def print_arg(x):
    print('print 2: {}'.format(x))
测试文件夹中的
foo.py
如下所示:

def print_arg(x):
    print('print 1: {}'.format(x))
def print_arg(x):
    print('print 2: {}'.format(x))
这是我在
main.py
中的代码,我正在其中导入
print\u 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\u arg\u 2
成为对
print\u 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)
回溯(最近一次呼叫最后一次):
文件“C:\Users\jeroe\AppData\Local\Programs\Python\Python37\lib\site packages\IPython\core\interactiveshell.py”,第3326行,运行代码
exec(代码对象、self.user\u全局、self.user\n)
文件“”,第5行,在
从foo导入打印参数2作为打印参数2
导入错误:无法从“foo”导入名称“print\u arg\u 2”(C:\Users\jeroe\PycharmProjects\test\u import\foo.py)
将测试文件夹中的
foo.py
文件名更改为例如
foo2.py
会起作用。但是,我不希望更改文件名

所以我有两个问题:

  • 谁能解释一下这里发生了什么事

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


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

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

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

    from test.foo import print_arg as print_arg_2
    

    您从同一文件导入了两次。在第一个代码段中,将第二个导入语句从test.foo import print_arg更改为print_arg_2。Python导入路径反映文件所在目录的名称。try
    from test.foo import print_arg as print_arg_2
    谢谢您的回答。如果您能向我解释一下为什么单独导入模块(没有测试文件夹中的
    \uuu init\uuuuuuuupy
    文件)可以这样工作:
    import sys
    sys.path.insert(1'./test')
    从foo导入print\u arg作为print\u arg 2
    print\u arg 2(1)
    在这种情况下,您将目录测试添加到路径中,这意味着您可以直接从路径中导入模块。这不是导入嵌套包的推荐方法,因为您可以很容易地创建命名冲突,这是一个更模糊的解决方案。有关
    sys.path.insert
    的详细信息。实际上,在您提到的例子中,您正在创建名称冲突,因为导入的函数具有相同的名称