Pip安装忽略MANIFEST.in中的文件 - 如何正确结构化项目?

7 投票
1 回答
2463 浏览
提问于 2025-04-18 14:15

我看了很多关于这个问题的资料,但还是找不到解决办法,所以我决定再问一次,因为我甚至不确定我的Python包的文件夹结构是否正确。

简单来说,我正在开发一个应用程序,它使用Tornado这个网络服务器框架,我想把它打包,这样用户就可以通过pip安装,并且可以使用一个基本的脚本来启动网络服务器。

我的文件夹结构如下:

├── MANIFEST.in
├── README.md
├── config
│   └── default.cfg
├── docs
│   ├── Makefile
│   ├── _build
│   ├── _static
│   ├── _templates
│   ├── conf.py
│   ├── index.rst
├── foopackage
│   ├── __init__.py
│   ├── barmodule.py
│   └── bazmodule.py
├── setup.py
├── static
│   ├── css
│   │   ├── menu.css
│   │   └── main.css
│   ├── img
│   │   └── logo.png
│   ├── js
│   │   ├── ui.js
│   │   └── navigation.js
│   └── lib
│       ├── d3.v3.min.js
│       └── jquery-1.11.0.min.js
└── templates
    ├── index.html
    └── whatever.html

Python代码在foopackage这个包里。

MANIFEST.in文件会递归地包含configstatictemplatesdocs这些文件夹。

这是我的setup.py文件(只包含相关部分):

from setuptools import setup

setup(name='foo',
      version='0.1.0',
      packages=['foopackage'],
      include_package_data=True,
      install_requires=[
          'tornado>=3.2.2',
      ],
      entry_points={
          'console_scripts': [
              'foo=foopackage.barmodule:main',
          ],
      },
)

如果我运行python setup.py sdist,所有东西都会被很好地打包,包括docstemplatesconfig文件等。但是,如果我运行pip install ...,只有foopackage会被安装,其他的都被忽略了。

我该如何将这些额外的文件包含到安装过程中?我的文件夹结构可以吗?我还听说过“伪造一个包”,就是把所有东西放在一个文件夹里,然后加一个__init__.py文件,但这对我来说似乎有点奇怪 :-\

1 个回答

2

我通过把 static 文件夹移动到实际的 Python 模块目录(foopackage)来解决这个问题。看起来,如果不把文件夹放在包里面,最上层的“非包”文件夹会被忽略。

撰写回答