首页 > 解决方案 > find_packages() 不包括主项目文件夹

问题描述

我在排除 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功能,我并不关心脚本的主文件夹。

标签: pythonpython-3.xsetuptools

解决方案


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

推荐这样的项目布局:

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

setup.py像这样修改:

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

推荐阅读