草庐IT

python - 为每个操作系统卡住一个 python 脚本

coder 2023-05-25 原文

在过去的几年里,我用 python 编写了一个不错的小程序,现在我想分发它,但我的第一次尝试并没有引起太大的热情,因为许多潜在用户不喜欢这个想法下载和安装 python 以及运行我的应用程序所需的所有依赖项。

我花了数周的时间寻找解决方案,以某种方式将我的代码编译成易于所有人运行的东西,但我对我的发现并不满意。

我对卡住应用程序而不是真正编译它的想法没有任何问题。这只是意味着最终用户将再等待几秒钟来下载应用程序,并将占用他/她的硬盘上的更多空间。

我的问题是找到一种方法将所有应用程序打包到每个操作系统的可执行文件中(假设是大操作系统:windows、mac、linux - 显然每个操作系统都有不同的可执行文件),而无需安装虚拟机或 Wine 或类似的选择。我强烈怀疑这是可能的,因为我看到一堆 ren'py 游戏完全按照我想要打包我的应用程序的方式打包,但我不知道如何为我的程序获得相同的结果。

从原理上讲,我的应用程序需要一个控制台才能运行,并且包括一些自制的包,numpy 和 matplotlib。它还有一个支持多种语言的系统,动态包含一个语言文件,覆盖以前的设置:

exec('from lang.%s import lang' % language)

我怀疑这可能会造成一些问题。最后,该程序在第一次运行时需要几个文件夹来保存其设置、日志等,因此这些也应该包括在内。我的电脑运行 ubuntu mate 16.10 (x64),python 版本是 2.7,但在未来我打算将它翻译成 python 3。创建的可执行文件可以是包含几乎所有需要的单个重文件或轻量级文件,其他所有文件都可以在附近的文件夹中找到;我真的不喜欢其中一种解决方案。

我知道这个问题会不时出现,并且可能已经得到解答,但我能找到的此类问题的最后一次出现要追溯到 2014 年,如果我们考虑事情变化的速度,这听起来像是很久以前的事了在这个领域。

编辑:由于我提出的条件似乎没有解决方案,我可以考虑设置一些模拟器/包装器/兼容层/任何东西来为不同的操作系统运行冷冻机,但我'不知道该怎么办。我在这里和那里读到,wine 并不总是能正常工作,也找不到任何东西可以在 Linux 上为 mac 编译。据我了解,该程序不需要针对 32/64 位系统进行不同的编译,但是如果有一种简单的方法可以针对每种可能性进行编译,那就太好了。虚拟机仍然不行,现在我的磁盘上没有空间来设置两个或更多虚拟机(这是 ssd 磁盘的最大缺点......),更不用说为操作系统支付许可证了一年用几次来编译一个免费软件。

最佳答案

先做一些事情。

  • Python 已经是跨平台的了
  • Python 代码是解释型的,不是 native 编译的语言,不需要编译
  • Python setuptools 中存在标准方法来分发具有跨平台兼容性的可执行脚本
  • 第三方 python 库可以包含 native 代码(C 语言),这些代码在安装时需要编译,或者软件包维护者可以使用二进制包。 NumPy 和 matplotlib 属于此类,并且确实有可用于 Windows AFAIK 的二进制包。

这里是一些示例 setup.py 代码来安装可执行脚本:

from setuptools import setup, find_packages
setup(<...>,
      entry_points={'console_scripts': [
          '<console cmd name here> = my_package.module:main'
]})

例如,my_package.module 在哪里

my_package/module.py:

<..>
def main():
    <what to run when <console cmd name here> is executed>

然后可以将包作为标准 python 模块分发,可通过 pip 安装。如果代码是开源的,它可以托管在 PyPi 上(有关如何设置,请参阅 PyPi 网站上的说明)。

否则,可以构建源代码或二进制 wheel 包(分别为 python setup.py sdistpython setup.py bdist_wheel)并将其分发给您的用户。

二进制轮子需要在要安装的平台上构建,源代码分发可以在任何平台上运行,但需要在安装时执行代码,因为它们包含纯源代码。

请注意,构建/安装二进制轮包需要 pip 版本 >= 6.0setuptools >= 26.0 .

安装此包后, 可执行文件将可用于在可以成功安装该包的所有平台上运行。

有关执行此操作的简单示例包,请参阅 hello-world-python-package ,特别是它的setup.py .

pythonwheels site有关二元轮包的更多信息。

关于python - 为每个操作系统卡住一个 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42467741/

有关python - 为每个操作系统卡住一个 python 脚本的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  6. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  7. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  8. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

随机推荐