是否可以创建一个独立文件来导入使用 pybind 创建的 python 库?

Is it possible to create a standalone file to import a python library created with pybind?

我希望我的问题很清楚,如果不清楚请告诉我。

我正在使用 OpenImageIO 的 python 绑定 (pybind11) 用于某些将在数百台计算机上 运行 的脚本。不幸的是,我花了很多时间来安装 OpenImageIO 并使其与我的 Python2 安装一起使用。我想知道是否有办法创建一个 file/folder,我可以将其发送到其他计算机,以便他们可以简单地使用“pip install file/folder”安装 Python 模块。

感谢您的帮助

您是否运行使用共享文件系统在计算集群上安装脚本?如果是这样,则无需创建单独的安装python 每台机器。最简单的解决方案是在所有机器都可以访问的位置创建一个 python 环境。在非系统位置创建 Python 环境的一种简单方法是使用 Miniconda。将其安装到共享(网络)位置,并创建一个供所有计算机使用的环境。

如果您的机器没有共享文件系统,那么您将需要以某种方式在所有机器上独立地重现环境。在这种情况下,没有简单的方法可以使用 pip.**

但如果您可以改用 conda,那么就有一个非常简单的解决方案。首先,将所需的一切安装到单个 conda 环境中。然后你有一个选择:你可以导出conda包列表,或者干脆把整个conda环境目录复制到其他机器上。

OpenImageIO 可从 conda-forge 频道获得,这是一个社区开发的 conda 包存储库。包的名称是 py-openimageio。他们已经停止更新 python-2.7 版本,但旧版本仍然可用。

操作方法如下。

  1. 安装Miniconda-2.7
  1. 使用 python 2.7、OpenImageIO 和您需要的任何其他包创建新环境:
conda create -n jao-stuff -c conda-forge py-openimageio python=2.7
conda activate jao-stuff
python -c "import OpenImageIO; print('It works!')"
  1. 执行以下操作之一:

    一个。导出您环境中的包列表:

    conda env export -n jao-stuff -f jao-stuff-packages.yaml
    

    然后,在其他机器上安装 Miniconda,然后使用上一步中的包列表创建环境:

    conda create -n jao-stuff --file jao-stuff-packages.yaml
    

    b。把环境中的所有文件复制到其他机器上,直接运行就可以了。 Conda 环境是自包含的(除了一些低级系统库),因此您通常可以将整个东西复制到另一台机器上,然后 运行 它无需任何进一步的安装步骤。

    tar czf jao-stuff.tar.gz $(conda info --prefix)/envs/jao-stuff
    

    在另一台机器上,在任何地方解压缩 tarball,只 运行 它包含的 python 可执行文件:

    tar xzf jao-stuff.tar.gz
    jao-stuff/bin/python -c "import OpenImageIO; print('It works!')"
    

**那是因为 OpenImageIO 是一个 C++ 项目,具有多个 C++ 依赖项,并且它们不提供 wheel 格式的二进制文件。我不怪他们——pip 不太适合这个用例,即使有轮子也是如此。另一方面,Conda 正是为这种用例而设计的,并且非常适合它。