我如何使setup.py包含一个不是代码一部分的文件?(具体来说,它是一个许可证文件,但也可以是其他任何东西。)
我希望能够控制文件的位置。在原始源文件夹中,文件位于包的根目录中。(即与最顶层的__init__.py在同一层。)我希望它在安装包时保持在那里,而不管操作系统是什么。我怎么做呢?
我如何使setup.py包含一个不是代码一部分的文件?(具体来说,它是一个许可证文件,但也可以是其他任何东西。)
我希望能够控制文件的位置。在原始源文件夹中,文件位于包的根目录中。(即与最顶层的__init__.py在同一层。)我希望它在安装包时保持在那里,而不管操作系统是什么。我怎么做呢?
当前回答
步骤1:创建MANIFEST。和setup.py在同一个文件夹里
步骤2:在MANIFEST.in中包含要添加的文件的相对路径
include README.rst
include docs/*.txt
include funniest/data.json
步骤3:在setup()函数中设置include_package_data=True,将这些文件复制到site-package
参考资料在这里。
其他回答
步骤1:创建MANIFEST。和setup.py在同一个文件夹里
步骤2:在MANIFEST.in中包含要添加的文件的相对路径
include README.rst
include docs/*.txt
include funniest/data.json
步骤3:在setup()函数中设置include_package_data=True,将这些文件复制到site-package
参考资料在这里。
我想对其中一个问题发表评论,但我没有足够的声誉来做>.>
以下是对我有效的方法(参考文档后想到的):
package_data={
'mypkg': ['../*.txt']
},
include_package_data: False
奇怪的是,最后一行对我来说也很重要(你也可以省略这个关键字参数——它的工作原理是一样的)。
它的作用是复制顶级目录或根目录中的所有文本文件(比您想分发的包mypkg高一级)。
在setup.py下的setup(:
setup(
name = 'foo library'
...
package_data={
'foolibrary.folderA': ['*'], # All files from folder A
'foolibrary.folderB': ['*.txt'] #All text files from folder B
},
这里有一个对我有用的更简单的答案。
首先,根据上面Python Dev的注释,setuptools是不需要的:
package_data is also available to pure distutils setup scripts
since 2.3. – Éric Araujo
这很好,因为在包中添加setuptools要求意味着您也必须安装它。简而言之:
from distutils.core import setup
setup(
# ...snip...
packages = ['pkgname'],
package_data = {'pkgname': ['license.txt']},
)
我只是想跟进我在Centos 6上的Python 2.7中发现的一些东西。如上所述,添加package_data或data_files对我不起作用。我加了一份清单。IN中有我想要的文件,这些文件将非python文件放入tarball中,但没有通过RPM将它们安装到目标机器上。
最后,我能够使用setup/setuptools中的“选项”将文件导入到我的解决方案中。选项文件允许您从setup.py修改规范文件的各个部分。如下。
from setuptools import setup
setup(
name='theProjectName',
version='1',
packages=['thePackage'],
url='',
license='',
author='me',
author_email='me@email.com',
description='',
options={'bdist_rpm': {'install_script': 'filewithinstallcommands'}},
)
file - MANIFEST.in:
include license.txt
文件 - 文件与安装命令:
mkdir -p $RPM_BUILD_ROOT/pathtoinstall/
#this line installs your python files
python setup.py install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
#install license.txt into /pathtoinstall folder
install -m 700 license.txt $RPM_BUILD_ROOT/pathtoinstall/
echo /pathtoinstall/license.txt >> INSTALLED_FILES