4

我的文件夹/文件结构是:

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'
          ]
      }
      )

我无法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'
4

2 回答 2

2

尝试像这样导入它:from test.test1 import Test1

于 2017-03-13T14:13:06.683 回答
0

基本上,你被困在 python 的相对导入陷阱中。当涉及到相对导入时,Python 导入系统有点复杂。因此,必须谨慎使用相对导入(为此,请尝试为您的模块命名,这不会与标准模块/包冲突)。当您在 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

于 2017-03-13T14:23:22.637 回答