为什么运行"setup.py test"运行我的控制台脚本?

det*_*tly 5 python setuptools

我非常简单的示例项目包含:

addtest/
  setup.py
  addtest/
    __init__.py
    __main__.py
    app.py
Run Code Online (Sandbox Code Playgroud)

app.py只是:

def main():
    raise SystemExit("Command line entry point called.")
Run Code Online (Sandbox Code Playgroud)

__main__.py只是:

from addtest.app import main
main()
Run Code Online (Sandbox Code Playgroud)

我的setup.py包含:

from setuptools import setup, find_packages

setup(
    name='AddTest',
    version='1.0',
    packages=find_packages(),

    entry_points={
        'console_scripts': ['addtest = addtest.app:main']
    },
)
Run Code Online (Sandbox Code Playgroud)

我希望运行python setup.py test什么都不会,因为没有编写单元测试.但是,在一个干净的virtualenv(Ubuntu 18.04.1上的Python 3.6.6)中运行它给了我:

$ python setup.py test
running test
running egg_info
writing AddTest.egg-info/PKG-INFO
writing dependency_links to AddTest.egg-info/dependency_links.txt
writing entry points to AddTest.egg-info/entry_points.txt
writing top-level names to AddTest.egg-info/top_level.txt
reading manifest file 'AddTest.egg-info/SOURCES.txt'
writing manifest file 'AddTest.egg-info/SOURCES.txt'
running build_ext
Command line entry point called.
Run Code Online (Sandbox Code Playgroud)

注意Command line entry point called.这意味着它调用它从我生成的控制台脚本__main__.py(或者可能只是调用python -m addtest).

为什么setup.py在我希望它运行测试时调用控制台脚本?脚本的执行进一步的检查表明sys.argv['setup.py','test']-为什么?

Dra*_*orn 0

我认为你必须在 setup.py 中指定测试的入口点。否则它会将其传递给 main.py。