【问题标题】:find_packages() does not include main project folderfind_packages() 不包括主项目文件夹
【发布时间】:2020-03-29 19:01:09
【问题描述】:

我在排除 setup.py 文件中的文件时遇到问题。首先我展示项目结构。

myscript
├── myscript
│   ├── tests.py
│   └── myscript.py
├── README.md
├── LICENSE
└── setup.py

setup.py文件内容如下:

# -*- coding: utf-8 -*-
from setuptools import setup, find_packages

with open('README.md') as f:
    long_description = f.read()

setup(name = 'myscript',
    version = "1.0",
    description = 'Example desc',
    long_description = long_description,
    long_description_content_type = 'text/markdown; charset=UTF-8',
    license = 'MIT',
    author = 'Jalkhov',
    author_email = 'jalkhov@gmail.com',
    packages = find_packages('myscript', exclude=['tests.py']),   
    entry_points={
        'console_scripts': [
            'myscript=myscript.myscript:main',
        ],
},
)

当我使用这样的文件运行 python setup.py sdist 并安装它为我生成的 .tar.gz 文件时,它会正确安装,但是当我尝试从控制台,它会抛出以下错误:

File "C:\Users\myuser\AppData\Local\Programs\Python\Python37-32\Scripts\myscript.exe.main__.py", line 4, in <module>ModuleNotFoundError: No module named 'myscript'

然后我检查了site-packages 文件夹,我找到的唯一与脚本有关的是myscript-1.0.dist-info 文件夹

但是当我修改包行并像这样离开时:

packages = ["myscript"],

我安装了,一切运行正常,但我要排除的文件已包含在 site-packages 文件夹中。

似乎通过使用find_packages 函数,我并不关心脚本的主文件夹。

【问题讨论】:

    标签: python python-3.x setuptools


    【解决方案1】:

    你实际上根本没有包,所以不要使用find_packages。请改用py_modules 进行单文件分发。

    推荐这样的项目布局:

    myscript
    ├── LICENSE
    ├── README.md
    ├── myscript.py
    ├── setup.py
    └── tests
        └── test_myscript.py
    

    并像这样修改setup.py

    setup(
        ...
        py_modules=["myscript"],
    )
    

    【讨论】:

    • 我建议将目录tests 重命名为test,这样它会自动拾取并放置在 sdist 中,但仍未安装且未放置在 bdist.
    【解决方案2】:

    好像myscript/myscript/__init__.py 文件丢失了。

    无论如何,find_packages() 遍历目标目录,按包含模式过滤,并找到 Python 包(任何目录)。只有包含__init__.py 文件的包才会被识别。最后,应用排除模式来移除匹配的包。

    -- setuptools documentation for find_packages

    【讨论】:

    • 但是第二个myscript文件夹不是包,它是包含源代码和测试文件的文件夹。 packages参数我不是很懂,它是用来查找包,即包含模块的文件夹,还是指向脚本的源代码?在这种情况下是第二个 myscript 文件夹,因为正如我所说,它不是一个包。
    • @Jalkhov 我一定以某种方式错过了这些信息。如果它不是一个包而只是一个模块,那么使用setuptools.setup函数调用的py_modules参数。请参阅 wim 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多