导入另一个文件错误
Import Another File Error
我的 folder/file 结构是:
testpkg/test/__init__.py;
testpkg/test/test1.py
testpkg/test/test2.py
testpkg/setup.py
testpkg/test/__init__.py
文件为空。
testpkg/test/test1.py
文件内容:
class Test1:
def __init__(self, name):
self.name = name
def what_is_your_name(self):
print(f'My name is {self.name}')
testpkg/test/test2.py
文件内容:
from .test1 import Test1
def main():
t = Test1('me')
t.what_is_your_name()
if __name__ == '__main__':
main()
/testpkg/setup.py
内容:
from setuptools import setup
setup(name='test',
version='0.1',
packages=['test'],
entry_points={
'console_scripts': [
'test_exec = test.test2:main'
]
}
)
我不能 debug/run test2.py
直接编写脚本,因为它给我错误:
» python test/test2.py
Traceback (most recent call last):
File "test/test2.py", line 1, in <module>
from .test1 import Test1
ModuleNotFoundError: No module named '__main__.test1'; '__main__' is not a package
但是当我用 pip install -U .
安装它时
有效:
» pip install -U .
Processing /home/kossak/Kossak/files_common/PythonProjects/testpkg
Installing collected packages: test
Found existing installation: test 0.1
Uninstalling test-0.1:
Successfully uninstalled test-0.1
Running setup.py install for test ... done
Successfully installed test-0.1
» test_exec
My name is me
问题是:如何正确地编写 test2.py
以便它以两种方式工作 - 直接(因此我可以在 PyCharm 或 运行 中调试它使用 python test2.py
) 并在安装 test
软件包后? 我尝试更改行:
from .test1 import Test1
至
from test1 import Test1
(删除点)
我可以从命令行 运行 test2.py
,但是安装后,我的脚本 "test_exec" 给我错误:
Traceback (most recent call last):
File "/home/kossak/anaconda3/bin/test_exec", line 11, in <module>
load_entry_point('test==0.1', 'console_scripts', 'test_exec')()
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 565, in load_entry_point
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2598, in load_entry_point
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2258, in load
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2264, in resolve
File "/home/kossak/anaconda3/lib/python3.6/site-packages/test/test2.py", line 1, in <module>
from test1 import Test1
ModuleNotFoundError: No module named 'test1'
尝试像这样导入它:from test.test1 import Test1
基本上,您陷入了 python 的相对导入陷阱。 Python 涉及相对导入时,导入系统有点复杂。因此,必须谨慎使用相对导入(为此,请尝试为您的模块提供这样的名称,这不会与标准 modules/packages 冲突)。当你在 python 包中写入任何文件时,你总是会遇到这个问题。您将有两种情况:-
1) 运行 文件作为模块
python -m package.module
2) 将文件作为脚本运行
# cd package
python module.py
在正常情况下,事情会很好,但是当你像你所做的那样做相对导入时,然后 运行 文件作为脚本,将导致问题,因为相对导入是针对 __name__
解决的模块变量,在脚本的情况下将是 '__main__'
,因此在解析相对导入时会遇到问题。
参考以下文章:- http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html
我的 folder/file 结构是:
testpkg/test/__init__.py;
testpkg/test/test1.py
testpkg/test/test2.py
testpkg/setup.py
testpkg/test/__init__.py
文件为空。
testpkg/test/test1.py
文件内容:
class Test1:
def __init__(self, name):
self.name = name
def what_is_your_name(self):
print(f'My name is {self.name}')
testpkg/test/test2.py
文件内容:
from .test1 import Test1
def main():
t = Test1('me')
t.what_is_your_name()
if __name__ == '__main__':
main()
/testpkg/setup.py
内容:
from setuptools import setup
setup(name='test',
version='0.1',
packages=['test'],
entry_points={
'console_scripts': [
'test_exec = test.test2:main'
]
}
)
我不能 debug/run test2.py
直接编写脚本,因为它给我错误:
» python test/test2.py
Traceback (most recent call last):
File "test/test2.py", line 1, in <module>
from .test1 import Test1
ModuleNotFoundError: No module named '__main__.test1'; '__main__' is not a package
但是当我用 pip install -U .
有效:
» pip install -U .
Processing /home/kossak/Kossak/files_common/PythonProjects/testpkg
Installing collected packages: test
Found existing installation: test 0.1
Uninstalling test-0.1:
Successfully uninstalled test-0.1
Running setup.py install for test ... done
Successfully installed test-0.1
» test_exec
My name is me
问题是:如何正确地编写 test2.py
以便它以两种方式工作 - 直接(因此我可以在 PyCharm 或 运行 中调试它使用 python test2.py
) 并在安装 test
软件包后? 我尝试更改行:
from .test1 import Test1
至
from test1 import Test1
(删除点)
我可以从命令行 运行 test2.py
,但是安装后,我的脚本 "test_exec" 给我错误:
Traceback (most recent call last):
File "/home/kossak/anaconda3/bin/test_exec", line 11, in <module>
load_entry_point('test==0.1', 'console_scripts', 'test_exec')()
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 565, in load_entry_point
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2598, in load_entry_point
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2258, in load
File "/home/kossak/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg/pkg_resources/__init__.py", line 2264, in resolve
File "/home/kossak/anaconda3/lib/python3.6/site-packages/test/test2.py", line 1, in <module>
from test1 import Test1
ModuleNotFoundError: No module named 'test1'
尝试像这样导入它:from test.test1 import Test1
基本上,您陷入了 python 的相对导入陷阱。 Python 涉及相对导入时,导入系统有点复杂。因此,必须谨慎使用相对导入(为此,请尝试为您的模块提供这样的名称,这不会与标准 modules/packages 冲突)。当你在 python 包中写入任何文件时,你总是会遇到这个问题。您将有两种情况:-
1) 运行 文件作为模块
python -m package.module
2) 将文件作为脚本运行
# cd package
python module.py
在正常情况下,事情会很好,但是当你像你所做的那样做相对导入时,然后 运行 文件作为脚本,将导致问题,因为相对导入是针对 __name__
解决的模块变量,在脚本的情况下将是 '__main__'
,因此在解析相对导入时会遇到问题。
参考以下文章:- http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html