项目树:
$.
??? happy_birthday-art.txt
??? happy_birthday.py
??? MANIFEST.in
??? README.rst
??? setup.py
Run Code Online (Sandbox Code Playgroud)
setup.py
from setuptools import setup
setup(
name='Happy_birthday',
py_modules=['happy_birthday'],
data_files=['happy_birthday-art.txt'],
entry_points={
'console_scripts': ['happy_birthday = happy_birthday:main', ],},
long_description=open('README.rst').read(),
)
Run Code Online (Sandbox Code Playgroud)
现在,当我在虚拟环境中执行python setup.py sdist
然后pip install
创建的.tar.gz
文件时,我收到以下消息:
warning: install_data: setup script did not provide a directory for 'happy-birthday-art.txt' -- installing right in '/home/username/.virtualenvs/happy_birthday'
Run Code Online (Sandbox Code Playgroud)
该程序使用该.txt文件,因此在尝试之后运行它时会失败.
但我不想安装happy_birthday-art.txt
到单独的文件夹中.我想将它安装在安装的文件夹中happy_birthday.py
.另外,我不想使用绝对路径setup.py
.我如何最好地设置我的setup.py
文件?
在构建RPM包的过程中,我必须指定BuildRoot,稍后将在%install中使用,它将调用$ RPM_BUILD_ROOT.我一直认为$ RPM_BUILD_ROOT是RPM执行打包的虚假安装.然后,在安装时使用RPM包,它将安装到实际位置.例如:
$RPM_BUILD_ROOT/usr/bin
Run Code Online (Sandbox Code Playgroud)
我认为$ RPM_BUILD_ROOT仅用于打包过程,并且在某些方面RPM可以区分$ RPM_BUILD_ROOT和实际安装位置,当用户执行"rpm -ivh package.rpm"时将是/ usr/bin.
但是最近在阅读一些文档时,建议$ RPM_BUILD_ROOT是将要安装的实际位置,并且$ RPM_BUILD_ROOT由用户使用环境变量$ RPM_BUILD_ROOT的设置指定,以便让用户在他们的愿望中安装包位置.否则,$ RPM_BUILD_ROOT将为null,它将安装到默认位置.在上面的例子中,它是/ usr/bin.因此,$ RPM_BUILD_ROOT不仅适用于打包或"虚假安装"过程,而且是用户定义安装位置的一种方式,类似于Windows中的选择文件夹位置.
我不知道我的想法是否正确.有人可以验证吗?提前致谢.
Python打包教程建议“应首选静态元数据 (setup.cfg)。动态元数据 (setup.py) 仅应在绝对必要时用作逃生舱口。setup.py 曾经是必需的,但可以通过省略新版本的 setuptools 和 pip。”
打包和分发项目指南解释说“setup.cfg 是一个 ini 文件,其中包含 setup.py 命令的默认选项。有关示例,请参阅 PyPA 示例项目中的 setup.cfg。”
这个例子完全没用,而且似乎没有很多其他有用的信息。本教程中的示例表明,可以setuptools.setup()
在 中列出一些或可能全部有效参数setup.cfg
,但对此效果没有真正的解释。特别是,不清楚如何将列表参数(例如非常常见且重要的install_requires
参数)转换为setup.cfg
.
正如我通过推论和实验确定的,正确的方法如下:
[options]
install_requires =
dependency_1
dependency_2
Run Code Online (Sandbox Code Playgroud)
显然,最好将其正确记录在某处,以便新的包创建者不必仅仅为了指定其项目的依赖项而经历类似的过程。
存在这样的文档吗?
轮子在鸡蛋上的优势很明显(参见为什么不用鸡蛋?https://pypi.python.org/pypi/wheel).
然而,我并不完全清楚使用车轮的优点是什么tar.gz
.我可能会遗漏一些明显的东西,比如"它们是一样的".我认为它们都可以直接使用pip
(即使在Windows中),具有相似的尺寸,并且在打包时需要类似的工作.听起来像是在证明包装方法论时可能遇到的问题.
编辑:刚刚找到一个tar.gz
可能比轮子更好的例子.CherryPy(https://pypi.python.org/pypi/CherryPy)仅为Python 3.x提供轮子,所以如果你想拥有一个本地存储库来为Python 2.7和3.x依赖项提供CherryPy,它似乎是存储tarball更有意义.它是否正确?(只是为讨论添加一些"基于案例"的理由)
我已经创建了一个旨在从命令行使用的python脚本.我该如何包装呢?这是我的第一个python包,我已经阅读了一些关于setuptools的内容,但我仍然不确定最好的方法.
我最终使用setup.py,其中包含以下关键配置:
setup(
....
entry_points="""
[console_scripts]
mycommand = mypackage.mymodule:main
""",
....
)
Run Code Online (Sandbox Code Playgroud)
这是上下文中的一个很好的例子.
有没有办法使用额外的python包索引(ala pip --extra-index-url pypi.example.org mypackage
),setup.py
以便运行python setup.py install
可以找到托管在其上的包pypi.example.org
?
我已经阅读了一些关于.egg文件的内容,我已经在我的lib目录中注意到了它们,但是当时作为开发人员使用它的优点/缺点是什么?
在eclipse中的一个项目中的src目录中创建一个文件夹时,它会使该文件夹成为一个包.有没有办法避免这个文件夹自动成为一个包?例如,我在src目录中添加主文件夹.我不希望它成为一个包.我怎样才能做到这一点?
假设我以这种方式添加文件夹:src/main/org/apache.我不希望main.org.apache成为一个包,而是希望包装从org开始.(即org.apache).
我正在创建一个登录屏幕,用于多个不同的Android应用程序.打包它的最佳方法是什么,以便其他人可以在他们的应用程序上使用我的登录功能.在我们进行更改的情况下,它最好是自动同步它们.***编辑****似乎将它打包成库模块是最好的选择.如何上传这个模块,以便如果我们对这个模块进行更新,它将无缝更新,而无需从github中取出.
谢谢!
当我需要处理我的一个宠物项目时,我只是像往常一样克隆存储库(git clone <url>
),编辑我需要的东西,运行测试,更新setup.py
版本,提交,推送,构建包并将它们上传到PyPI.
使用有什么好处pip install -e
?我应该使用它吗?它将如何改善我的工作流程?
如果这有帮助,这是我目前打包并发送给PyPI的两个宠物项目,但从未使用过pip install -e
.一个是纯Python,另一个是Django包.
如何通过使用来改善项目的工作流程或结构pip install -e
?
packaging ×10
python ×7
setup.py ×3
java ×2
android ×1
api ×1
code-sharing ×1
command-line ×1
eclipse ×1
egg ×1
linux ×1
pip ×1
pypi ×1
python-wheel ×1
rpm ×1
setuptools ×1
tar ×1
zip ×1