Python distutils 设置 package_dir 的相对路径

4 投票
2 回答
2521 浏览
提问于 2025-04-18 18:03

我在这里查过:
如何让我的setup.py使用相对路径来访问我的文件?
还有这里:
python distutils没有包含数据文件

还有这里:
对setup.py中的package_dir和packages设置感到困惑 但没有找到解决办法。

我怀疑distutils不支持我想要使用的目录结构,但希望能得到确认和/或改进的建议。

我的目录结构如下:

/src  
├── user 
├── admin  
│   ├── admin.py  
│   ├── LICENSE.txt  
│   ├── MANIFEST  
│   ├── MANIFEST.in  
│   ├── README.txt  
│   └── setup.py  
└── lib  
    ├── __init__.py  
    ├── __init__.pyc  
    ├── rcodes.py  
    ├── rcodes.pyc  
    ├── validation.py  
    └── validation.pyc  

在这个结构中,src下的几个项目依赖于lib包。然而,当我尝试在/src/admin中运行setup.py时,无法将lib目录包含在最终的包中(使用setup.py sdist)。

setup.py的内容如下:

from distutils.core import setup

setup(
name='admin_server',
version='0.0.0',
author='Instamrkt',
author_email='info@instamrkt.com',
url='http://instamrkt.com',
description='Instamrkt Admin Server',
packages=['lib'],
package_dir = {'lib': '../lib'},
py_modules = [
'admin',
'lib.rcodes',
'lib.validation'
],)

这导致了:

[foozle@ip-172-31-36-251 admin]$ python setup.py sdist
running sdist
running check
reading manifest template 'MANIFEST.in'
writing manifest file 'MANIFEST'
creating admin_server-0.0.0
making hard links in admin_server-0.0.0...
hard linking README.txt -> admin_server-0.0.0
hard linking admin.py -> admin_server-0.0.0
hard linking setup.py -> admin_server-0.0.0
Creating tar archive
removing 'admin_server-0.0.0' (and everything under it)
[foozle@ip-172-31-36-251 admin]$ tar tzf ./dist/admin_server-0.0.0.tar.gz
admin_server-0.0.0/
admin_server-0.0.0/PKG-INFO
admin_server-0.0.0/admin.py
admin_server-0.0.0/setup.py
admin_server-0.0.0/README.txt

包lib缺失。

为了明确,我希望在包中保留相同的目录结构,这样我就可以在不同的应用程序中使用lib进行多个分发。

谢谢!

2 个回答

0

你可以扩展默认的sdist命令,并重写那些负责复制文件的方法。

可以查看make_distribution()和make_release_tree()这两个函数。

class rel_sdist(sdist):
    pass

setup(
    ...
    cmdclass={'sdist': rel_sdist},
)
2

当你使用package_dir选项指向一个上级目录(比如'../lib')时,无法创建源代码分发包,因为sdist会直接复制整个源代码树,而'../lib'会被放在构建目录之外。

不过,你可以创建一个二进制分发包:

python setup.py bdist

或者,如果你使用setuptools的话:

python setup.py bdist_wheel

后者的好处是,如果你的模块是纯Python的,它会创建一个与系统无关的分发包。

撰写回答