【问题标题】:Python scripts that depend on binaries... how to distribute?依赖二进制文件的 Python 脚本……如何分发?
【发布时间】:2012-04-13 20:35:35
【问题描述】:

我有一个代码库,其中包含一些 C++ 代码和 Python 脚本,这些脚本利用了生成的二进制文件(通过 subprocess 模块)。

root/
    experiments/
        script_1.py (needs to call binary_1)
    clis/
        binary_1.cc
        binary_1

从 Python 脚本中引用二进制文件的最佳方式是什么?

  • 从 Python 脚本目录到二进制文件的相对路径,假定用户将从特定目录运行 Python 脚本
  • 只是二进制名称,假定用户将二进制文件的目录添加到$PATH 变量,或将二进制文件复制到/usr/local/bin,或其他内容
  • 还有别的吗?

【问题讨论】:

  • 是不是只能从python模块调用的工具,从不单独使用?
  • @Keith 除了从 Python 调用之外,它也可以单独使用。

标签: python software-distribution


【解决方案1】:

根据我的经验,将 C(pp) 代码集成到 Python 程序中的最佳方法是 make a compiled Python module out of the C(pp) code,而不是像现在这样使用 subprocess 模块。

除了更一致和可读的 Python 代码库之外,您还可以获得模块化的额外好处(解决 $PATH 问题等)并且可以use distutils as build tool。分发也更容易,因为 setup.py 会自动执行。

【讨论】:

  • 另一件事......我的 cpp 二进制文件是独立的命令行工具,除了被 Python 脚本调用之外,它们本身很有用,因此将它们转换为已编译的 Python 模块并不是真的我认为要走的路。
  • 这仍然是要走的路。您需要检查您的设计:使用 Cpp 工具创建一个库,并在 Python 模块的 Cpp 前端和命令行前端中自然地使用它。您将代码拆分为 3 个子项目;这种模块化很好:这些设计原则实际上正是为了解决您现在面临的问题而存在的。
【解决方案2】:

如果您的二进制文件是预编译的,您可以使用data_files 参数来设置工具。将其安装在 /usr/local/bin 中。

data_files=[("/usr/local/bin", glob("bin/*"))], ...

【讨论】:

    【解决方案3】:

    您可以使用__file__ 找出 Python 脚本的位置,因此用户从哪里运行脚本并不重要。

    path = os.path.normpath(os.path.join(
             os.path.dirname(__file__), '..', 'clis', 'binary_1'
           ))
    

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2017-04-01
      相关资源
      最近更新 更多