如何从具有相同名称的2个python文件中加载具有相同名称的2个函数?

时间:2020-02-05 10:22:59

标签: python python-import

我遇到导入问题。我想做的是从具有相同名称的模块中导入具有相同名称的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个问题:

  1. 有人可以解释一下这是怎么回事吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

from test.foo import print_arg as print_arg_2
相关问题