标签: packaging

从Python项目创建单个可执行文件

我想从我的Python项目中创建一个可执行文件.用户应该能够在不需要安装Python的情况下下载并运行它.如果我只是分发一个包,我可以使用pip,wheel和PyPI来构建和分发它,但这需要用户拥有Python并知道如何安装包.我可以用什么来构建Python项目中的自包含可执行文件?

python packaging software-distribution exe compilation

73
推荐指数
3
解决办法
5万
查看次数

为分发Python程序创建debian包的标准方法?

有很多关于如何做到这一点的信息,但由于"有一种方法可以给猫皮肤",所以涵盖一些过程的所有教程/手册似乎都做出了与其他不同的某些假设.教程,我仍然无法掌握它.

到目前为止,这是我认为我理解的.

  1. 我的最终目标应该是创建一个"二进制".deb包.这样的包将是平台独立的(32/64位),因为所有的python程序都是这样的.
  2. 要创建"二进制"包,我首先需要创建一个源包.
  3. 要创建源包,我可以使用CDBSdebhelper.Debhelper是初学者的推荐方式.
  4. 创建源包的核心是在源目录中填充DEBIAN目录,其中包含许多文件,说明文件需要复制的位置,它们受到的版权和许可方案,它们具有哪些依赖关系等等......
  5. 如果 python源还附带了distutils 脚本,那么步骤#4可以在很大程度上自动化DEBIAN命令.dh_make

现在我的问题:

  1. 我对这个过程的理解是否正确?我有什么遗失,或者我错了什么?
  2. 第五步真的让我感到困惑:特别是对我来说最难以理解的两点是:
    • 如何编写setup.py安装独立程序的脚本? 编辑:通过独立程序我的意思是一个程序供桌面用户使用(而不是我理解的模块,就像导入后其他软件使用的功能集合).在我的具体情况下,我实际上需要两个这样的"程序":主软件和一个单独的实用程序(实际上是第二个"程序",应该与另一个程序包在同一个程序包中).
    • DEB包的这种脚本有什么特点?官方文档似乎只涉及RPM和Windows的东西......

顺便说一句:这些是迄今为止我能找到的最好的信息来源.如果你有什么比这更好的,请分享!:)

python debian packaging distutils debhelper

71
推荐指数
4
解决办法
3万
查看次数

如何制作包含DLL文件的JAR文件?

我买了第三方Java库,其中包含一个JAR文件和两个DLL文件.我编写了自己的Java程序来调用第三方JAR文件.现在我的问题是如何将我的所有代码打包成一个包含我所有代码和第三方JAR和DLL的JAR文件?

我知道SWT就是这种情况.在swt.jar包括DLL文件,但我不知道如何做到这一点,以及如何使其正常工作.

java dll swt packaging jar

66
推荐指数
2
解决办法
8万
查看次数

如何编写setup.py以包含git repo作为依赖项

我正在尝试为我的包编写setup.py.我的包需要指定对另一个git仓库的依赖.

这是我到目前为止:

from setuptools import setup, find_packages

setup(
    name='abc',
    packages=find_packages(),
    url='https://github.abc.com/abc/myabc',
    description='This is a description for abc',
    long_description=open('README.md').read(),
    install_requires=[
        "requests==2.7.0",
        "SomePrivateLib>=0.1.0",
        ],
    dependency_links = [
     "git+git://github.abc.com/abc/SomePrivateLib.git#egg=SomePrivateLib",
    ],
    include_package_data=True,
)
Run Code Online (Sandbox Code Playgroud)

当我跑:

pip install -e https://github.abc.com/abc/myabc.git#egg=analyse
Run Code Online (Sandbox Code Playgroud)

我明白了

找不到满足要求的版本SomePrivateLib> = 0.1.0(来自analyze)(来自版本:)未找到SomePrivateLib的匹配分布> = 0.1.0(来自analyze)

我究竟做错了什么 ?

python git django packaging setuptools

61
推荐指数
5
解决办法
2万
查看次数

pyproject.toml 文件有什么用?

背景

我正要尝试从 GitHub 下载的 Python 包,发现它没有 . setup.py,所以我无法安装它

pip install -e <folder>
Run Code Online (Sandbox Code Playgroud)

相反,该包有一个pyproject.toml文件,该文件似乎与setup.py通常的条目非常相似。

我发现了什么

谷歌搜索引导我进入PEP-518,它setup.py在基本原理部分给出了一些批评。但是,它没有明确说明setup.py应该避免使用 ,或者pyproject.toml完全取代setup.py.

问题

pyproject.toml用来代替的东西setup.py吗?或者一个包应该同时带有 apyproject.toml和 a setup.py
如何安装pyproject.toml处于可编辑状态的项目?

python packaging pip pyproject.toml

55
推荐指数
4
解决办法
2万
查看次数

使用默认值定义环境中的ant属性

我希望我的构建脚本能够在发布和开发环境中正常运行.

为此,我想在ant中定义一个属性,调用它(例如) fileTargetName

fileTargetNameRELEASE_VER如果它可用,它将从环境变量中获取它的值,如果它不可用,它将获得dev的默认值

帮助蚂蚁<condition><value></condition><property>使其工作表示赞赏.

java ant packaging release environment-variables

53
推荐指数
2
解决办法
5万
查看次数

如何捆绑包含依赖项的Python应用程序?

我需要将我的python应用程序,它的依赖项和python打包到一个MSI安装程序中.最终结果应该是:

  • Python安装在标准位置
  • 包及其依赖项安装在一个单独的目录中(可能是site-packages)
  • 安装目录应该包含未压缩的python,并且不需要独立的可执行文件

python packaging tkinter

51
推荐指数
3
解决办法
5万
查看次数

在打包Python项目时将zip_safe设置为True有什么好处?

setuptools文档仅指出:

为了获得最佳性能,最好将Python包安装为zip文件.但是,并非所有软件包都能够以压缩格式运行,因为它们可能希望能够像普通操作系统文件一样访问源代码或数据文件.因此,setuptools可以将您的项目安装为zipfile或目录,其默认选项由项目的zip_safe标志(引用)决定.

实际上,获得的性能优势是什么?是否值得调查我的项目是否是拉链安全的,或者这些好处通常是最小的?

python packaging setuptools

50
推荐指数
2
解决办法
2万
查看次数

没有Git元数据的Tarballing

我的源代码树包含几个使用Git源代码控制的目录,我需要对整个树进行tarball,不包括对Git元数据或自定义日志文件的任何引用.

我以为我会使用find/egrep/xargs/tar的组合,但不知何故tar文件包含.git目录和*.log文件.

这就是我所拥有的:

find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar
Run Code Online (Sandbox Code Playgroud)

有人能在这里解释我的误会吗?为什么tar处理find和egrep正在过滤的文件?

我也对其他技术持开放态度.

grep packaging tar find xargs

49
推荐指数
5
解决办法
3万
查看次数

其他语言/应用程序中python/setuptools入口点(扩展)的替代实现

虽然这个问题有一个python后端,但问题并不是与python本身有关,而是与扩展机制以及如何注册/查找插件有关.

在python中,入口点的概念是由setuptools引入的,并且与已安装的python发行版的元数据相关联(在其他包装系统中称为包).

根据我的理解,入口点提供的功能之一是允许应用程序定义其他人可以放置内容的位置,因此任何想要使用入口点的应用程序都可以获得已注册的类/函数列表.我们来举个例子:

  • Foo定义入口点"entrypoint1"并查找以此名称注册的插件.
  • Bar Bar.callable在"entrypoint1"入口点上注册callable().
  • 然后,任何python脚本都可以Bar.callable列为"entrypoint1"的已注册callables之一.

使用setuptools,应用程序在安装时注册入口点,信息存储在与打包相关的元数据中,称为.egginfo(通常包含有关分发名称,其依赖关系以及一些有关打包的元数据的信息).

我觉得包装元数据不是存储此类信息的正确位置,因为我不明白为什么这些信息与包装有关.

我很想知道其他语言中的入口点/扩展/插件功能,特别是如果这个概念与元数据和包装有关.所以问题是......

你有我应该看的例子吗?你能解释为什么设计选择是这样做的吗?

你能看到解决这个问题的不同方法吗?你知道这个问题在不同的工具中是如何解决的吗?当前python实现的缺点和优势是什么?


到目前为止我发现了什么

我在不同的项目中发现了一种创建和分发"插件"的方法,它们特别关注"我们如何制作插件".

例如,libpeas(gobject插件框架)定义了一组通过指定插件来扩展默认行为的方法.虽然这很有趣,但我只对"注册和查找"(并最终加载)部分感兴趣.

以下是我目前的一些调查结果:

Libpeas定义了自己的元数据文件(*.plugin),它存储有关可调用类型的信息(可以使用不同语言的不同插件).这里的主要信息是要加载的模块的名称.

Maven有一个设计文档,其中包含有关如何管理内容的信息.Maven管理具有依赖项和元数据的插件,因此它似乎是一个有趣的地方,可以查找它们如何实现的东西.

正如他们的文档中所指出的那样,maven插件正在@goal对类使用annotations(),然后用于查找使用特定注册的所有插件@goal.虽然这种方法在静态语言中是可行的,但它不是在解释语言中,因为我们只知道在给定时间点所有可能的类/可调用内容,这可能会改变.

Mercurial使用中央配置文件(~/.hgrc),其中包含插件名称到可以找到的路径的映射.


更多的想法

虽然这不是这个问题的答案,但有趣的是要注意如何实现setuptools入口点,以及它们如何在性能方面与多变的那些进行比较.

当您使用setuptools请求特定入口点时,将在运行时读取所有元数据,并以此方式构建列表.这意味着如果你的路径上有很多python发行版,这个读取可能需要一些时间.另一方面,Mercurial 将此信息硬编码到单个文件中,这意味着您必须指定可调用的完整路径,然后注册的callables不会被"发现",而是直接从配置文件中"读取".这允许对应该可用的内容进行更细粒度的配置,哪些内容不应该更好并且看起来更快.

另一方面,由于python路径可以在运行时更改,这意味着必须根据路径检查以这种方式提供的callable,以便知道是否应该在所有情况下返回它们.


为什么入口点目前与包装有关

了解为什么入口点与setuptools中的包装相关联也很有趣.主要原因是python发行版在安装时扩展入口点可能会注册其中一部分似乎很有用:然后安装意味着还要注册入口点:不需要额外的注册步骤.

虽然这在大多数情况下(当实际安装python发行版时)工作得相当好,但是当它们没有安装或者根本没有打包时就不会这样.换句话说,根据我的理解,如果没有.egg-info文件,则无法在运行时注册入口点.

python plugins packaging

49
推荐指数
1
解决办法
1717
查看次数