【问题标题】:"Compiling" Python to run on another machine“编译”Python 以在另一台机器上运行
【发布时间】:2017-01-22 19:12:43
【问题描述】:

我在笔记本电脑上使用 Pycharm 创建了一个用 Python 编写的简单中复杂度脚本,我希望使用 Crontab 在我的 Raspberry Pi 上运行它。我过去的所有编程经验都是在 Windows 中使用 C++ 和 C#,因此我通常会构建项目,然后将其全部编译并链接到单个可执行文件中。

对于 Python,您如何“编译”脚本以使其可以在另一台 PC 上运行?我使用了一些必须使用 Pycharm 应用程序安装的外部库(请求和 ImgurClient)。我想我认为这些也需要传递给 RaspPi 是正确的吗?我的脚本在两个文件中,所以我需要复制这两个文件吗?有没有办法将它们构建到一个文件中以便轻松使用?

这是我写的第一个脚本,只是根据我对其他语言的了解和一点谷歌搜索。只是现在我有了实际的脚本,不知道如何继续。

【问题讨论】:

  • 无需编译,只需要目标机器上兼容的Python版本即可。之后,就像复制 .py 文件并运行它一样简单。
  • 即使在 Linux 上也可以将解释器、脚本和 deps 打包成一个独立的可执行文件,但你真的不想。这将使你的程序启动起来比你用传统方式做的事情要慢得多——也就是说,通过复制 Python 源代码(可能打包为 Python egg 或类似的东西),安装一个解释器和任何必要的库依赖项,然后使用该解释器运行文件。 [在一些较大的机器上启动开销可能是可以容忍的,但在 Pi 上它会非常、非常、非常太慢]。
  • ...这是因为在该单个可执行文件实际运行之前,它需要将解释器和其他所有内容解压缩到单独的文件中(通常在临时目录中),所以你' 没有获得运行时速度优势(代码仍在解释中!),但在运行时速度上存在很大劣势(需要在启动时解包所有内容!)

标签: python cron pycharm


【解决方案1】:

Python 不需要编译,因为它是一种解释性语言。只要您不进行系统调用,您就可以在另一台机器上运行它。只有当您尝试在 linux 机器上执行诸如使用 windows 命令之类的操作时,系统调用才会成为问题。

只需将这两个文件复制到 pi 并正常运行即可。或者从终端

python program.py

【讨论】:

  • 我不需要安装我正在使用的外部库吗?我做“导入请求”等,所以树莓派需要知道如何找到它。
  • @TomDippé,是的,您需要安装它们,但您运行的是 Debian;它已将它们(嗯,绝对是 requests)打包。
  • @TomDippé 如果您不确定包含的软件包,您可以随时查看您的 python 路径。但查尔斯是正确的,因为大多数图书馆都会在那里。唯一可能不会是您稍后安装的额外库,即不是默认的 python 库,如 numpy 或 scipy。然后使用 pip 安装,apt 之类的 anaconda。
【解决方案2】:

使用 PyInstaller。在终端中,要创建一个独立的 exe,只需使用如下命令:

pyinstaller -F myscript.py

【讨论】:

  • 不适用于 Raspberry Pi——它们不运行 .exe 文件,而且您真的不希望 PyInstaller 解包的启动时间开销。
  • RaspPi 正在运行 Raspbian(基于 Debian),因此无法作为 exe 运行
  • @TomDippé, ...PyInstaller 实际上并不是仅适用于 Windows 的——它也可以创建 Linux 可执行文件——但是这些 Linux 可执行文件运行起来会非常缓慢(好吧,开始运行)一个 Pi。
【解决方案3】:

您可以将 python 文件“编译”为.pyc,但您仍然需要 RaspPi 上的 python 解释器来运行它们。

在没有 Python 的 PC 上,您可以使用 py2exe 创建一个独立的可执行文件,但该可执行文件必须在 Windows 上运行。

你必须在你的树莓派上安装一个 python 解释器,或者使用py2exe 创建一个以树莓派为目标的可执行文件(如果该平台上存在 py2exe),那将是另一个树莓派 :)

另一种选择是Cython,但如果外部库与您想要使用的库一样复杂,那将是一条非常困难的路线。

Python on Raspberry Pi

Creating python exes on Linux

【讨论】:

    【解决方案4】:

    正如其他答案所说,您可以在 Pi 上运行您的代码,因为 Python 代码是被解释的而不是被编译的。

    话虽如此,您需要预先安装任何 python 包,例如 ImgurClient。如果您在 PC 上使用 PyCharm 执行此操作,您可能必须在 Pi 上使用 pip

    【讨论】:

      【解决方案5】:

      我不知道你是否能够在你的其他环境中运行 python 脚本,特别是如果脚本使用你通常使用 pip 安装的外部库 (.whl)。

      在干净的环境中运行脚本的一个不错的选择是使用 virtualenv:

      https://virtualenv.pypa.io/en/stable/

      “它创建了一个有自己的安装目录的环境,它不与其他 virtualenv 环境共享库(并且可选地也不访问全局安装的库)”

      然后只安装运行脚本所需的库。如果您导出这个新环境,您可能能够毫无问题地运行您的脚本。

      【讨论】:

        【解决方案6】:

        如果您在 Raspberry Pi 上安装了 Python,那么您只需从 shell 运行:

        # This installs pip (Python installer) as well as the requests library
        sudo apt-get install python-pip
        

        安装完成后,运行:

        # To install the ImgurClient
        pip install imgurpython
        

        然后你可以在 shell 中运行你的脚本,输入:

        python your_script_name.py
        

        如果您尚未安装 Python,只需运行以下命令即可在其他命令之前安装它:

        sudo apt-get install python
        

        【讨论】:

        • requests 是否已经打包,还是应该在此处添加?
        • requests 作为pip 安装的一部分安装
        • 我在使用pip install imgurpython 命令时遇到问题。我收到“ImportError: cannoy import name IncompleteRead”错误。你知道这可能是什么原因吗?谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 2012-04-09
        • 1970-01-01
        • 2011-10-31
        • 2015-02-11
        • 1970-01-01
        • 2019-02-08
        相关资源
        最近更新 更多