Python的Windows安装程序包含所有依赖项吗?

15

我在PyPI存储库中有一个软件包。我通过运行以下命令来上传新版本的Windows安装程序,具体是使用'bdist_wininst':

python3 setup.py register sdist bdist_wininst upload

然而,当用户运行相关的 .exe 文件时,它并不会安装 Python 3 本身。此外,即使 Python 3 已经安装,也不会安装任何关联的依赖项。

如何创建一个能够在 Windows 上安装 Python 3,以及我的软件包和其依赖项的最佳方式?

如果这不可行,那么假设 Python 3 已经安装,创建一个安装我的软件包和其依赖项的 Windows 安装程序的最佳方式是什么?

我使用的是 Ubuntu 12.04。如果有帮助的话,这是我的 setup.py:

from distutils.core import setup

import codecs 
try: 
    codecs.lookup('mbcs') 
except LookupError: 
    ascii = codecs.lookup('ascii') 
    func = lambda name, enc=ascii: {True: enc}.get(name=='mbcs') 
    codecs.register(func) 

setup(
    name='SIGACTor',
    version='0.1.14dev',
    description=open('README.txt').read(),
    url='http://bitbucket.org/davidystephenson/sigactor',
    author='David Y. Stephenson',
    author_email='david@davidystephenson.com',
    packages=['sigactor'],
    license='Proprietary',
    long_description=open('README.txt').read(),
    install_requires=[
        'beautifulsoup4',
        'feedparser',
        'python-dateutil',
        'pyyaml'
    ],
)

1
人们应该只回答一次:http://askubuntu.com/questions/315428/python-windows-installer-with-all-dependencies --- 由于askubuntu将人们引回stackoverflow,也许这个问题应该成为回答问题的地方 :) - mnagel
非常抱歉 - 我没有意识到这个问题会被迁移。 - David Y. Stephenson
1
你想制作一个Windows可执行文件吗?你尝试过使用py2exe或者PyInstaller吗?这些包可以让你创建一个exe文件,使得没有安装Python的计算机也能运行你的程序。 - sytech
@Gator_Python 我正在尝试为一个Python模块创建安装程序。 - Daniel
@Daniel--这不是pip和PyPI的目的吗?我刚在Windows机器上使用pip install sigactor成功从PyPI下载并安装了此软件包(以及其依赖项)。 pip随Python一起在Windows上发货。 - sytech
@Daniel 如果您能解释一下您需要的东西超出了标准打包工具的范畴,那将会很有帮助。例如,为什么源代码分发和wheels对于您的使用情况不好? - Peter Brittain
1个回答

6

您应该尝试使用pynsist,它可以将Python与您的软件包捆绑在一起,并且基于知名的NSIS开源安装程序:

https://pypi.python.org/pypi/pynsist

安纳康达团队提供了基于conda和NSIS的Constructor:

https://github.com/conda/constructor

最后,使用WinPython和最稳定的安装程序InnoSetup来实现这种方法:

http://cyrille.rossant.net/create-a-standalone-windows-installer-for-your-python-application/

但如果你的包不是一个库而是一个应用程序,那么你可以使用Python和所有依赖项捆绑(冻结)它,甚至可以使用pyinstaller进行压缩:

http://www.pyinstaller.org

这是我在所有应用中使用的方法,即使有复杂的交互依赖关系!
奖励 - pyinstaller 的自动更新工具:

https://github.com/JMSwag/PyUpdater


1
+1 对于pyinstaller表示赞同。+0 没有提到cython。+0 Pyupdater是世界上最令人困惑的更新系统。我已经试图让它更新了两天...现在。我觉得SAAS是未来发展方向,而桌面应用程序则不幸成为了一个正在消亡的艺术品。 - user8900239
我对那些制作自定义环境的工具有过不好的经历,尤其是让所有东西都从一个单一文件中运行的工具。它们使得诊断问题变得不可能,并且不寻常的环境会破坏常见的假设以及依赖于它们的代码——这同样是无法诊断的。也就是说,你可以发布它,但是祝你好运去支持它。 - ivan_pozdeev
@ivan_pozdeev,那么您对于发布Python应用有什么建议? - denfromufa
最自然的选择是类似于 bdist_wininst 的 GUI,它可以 pip 安装一堆 wheels。https://www.lfd.uci.edu/~gohlke/code/redist_wininst.py.html 看起来正合适。 - ivan_pozdeev
这是我在所有应用程序中使用的东西,即使有着疯狂的交互依赖关系!你能解释一下或者提供一些帮助或链接吗?我已经包含了pypi模块和二进制文件,但是当我使用spec文件运行pyinstaller并启动我的exe时,它会显示没有numpy...因此,没有依赖项被捆绑。 - Hrvoje T
对于PyInstaller,您可能需要创建一个虚拟环境,只包含您的依赖项,并根据PyInstaller文档提供一个spec文件,其中包含特殊的包含或排除。 - denfromufa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接