如何创建可重定位的 Conda 环境?可行吗?

How to create a Relocatable Conda Environment? Is it doable?

我想做一个可重定位的环境。所以我需要在包安装中使用相对路径。为此,我只是创建了一个像这样的 Conda 环境:

conda create --prefix env python=3.6.5
activate .\env

然后我像往常一样安装了所需的软件包

pip install package_name

当我想安装自己的包时,问题就来了。我已经创建了一个这样的结构并且我遵循了 this tutorial:

some_root_dir/
|-- setup.py
|-- python_files
|-- |-- runall.py
|-- |-- test0.py

setup.py 的内容是这样的:

from setuptools import setup

setup(
    name='my_app',
    version='0.1',
    description='My app',
    keywords="app csv some other word",
    url='https://www.my_domain.com/',
    author='My name',
    author_email='email@email_domain.com',
    license='MIT',
    packages=['my_package'],
    zip_safe=False,
)

但安装后:

cd some_root_dir
pip install .

并将其移动到另一个位置,应用程序中出现的路径就是我执行 pip install .

的路径

我一直在寻找信息here,但没有找到任何有用的信息。

我想做的主要步骤

  1. 创建一个conda环境,用pip或者conda安装一些包,我自己的python包括包
  2. 将环境文件夹复制到另一台计算机
  3. 运行本机未安装conda和python的应用程序。如果我使用文件夹中包含的 python.exe python 应该知道安装包的位置以及如何导入它们。

问题

注意: 我正在使用 Windows 10 和 Miniconda 3。

虚拟环境

virtualenv 上的等价物是 this:

virtualenv --relocatable env_folder

但这是一个实验性功能

更新(2018 年 8 月 7 日)

其实我想要的是@interfect 在他的评论中所说的,问题是here。因此 conda 上的可重定位环境尚不可能

我认为可重定位环境取决于安装的包。它们应该使用相对路径并避免硬编码路径来实现。包的源代码中使用的所有路径都应该在自己的包内。因此,如果您安装完好的软件包,将环境重新定位到其他文件夹或计算机中将不会有任何问题。

由于您需要在包内添加所有文件夹,因此您需要修改 setup 的参数。添加这两个参数以便将文件夹添加到最终包中。如果你不这样做,文件夹将不会复制到环境中的 site-packages 文件夹(使用 pip 安装软件包时的最终目的地):

packages=[
    'main_folder',
    'main_folder.folder_with_python_files',
    'main_folder.other_folder_with_python_files',
],
package_data={
    'main_folder': [
        'static/css/*.*',
        'templates/*.*',
    ],
},

环境、包管理器和路径

我曾尝试使用 Virtualenv 在 Windows 上构建环境,但构建基本环境时遇到了一些问题:

  • 缺少一个 dll 库:VCRUNTIME140.dll
  • runpy 模块也丢失了。这用于带有 -m 参数的 运行 命令:python -m ...
  • 当我使用 pip 时没有安装其他依赖包,例如 zipfile

所以我又回到了 Conda Environments,但是我使用包管理器 pip 而不是 conda 构建了环境,因为包在我的情况下要轻得多。

因此,我的建议是使用 pip 安装软件包。如果搬迁后有任何问题,我们应该检查是否有硬编码路径并直接更改它。虽然最好的解决方案是修改原始源代码并安装自定义包。

环境中的某些 python 脚本在 header 上具有 #! 的绝对路径。

#!C:\absolute\path\to\python.exe

我刚刚删除了它们,因为如果我使用当前在环境 those headers are ignored

中的 python.exe 调用任何脚本

更新

conda-pack 也很有用。我还没试过

conda-pack is a command line tool for creating relocatable conda environments. This is useful for deploying code in a consistent environment, potentially in a location where python/conda isn’t already installed.

如果你把你的包变成一个 conda-package(如果你已经在使用 pip 就很简单),你只需在新机器上 conda 安装你的包,所有的东西都会在安装时重新定位。

这包括任何已编译的库,更不用说脚本中的路径了。 Conda 将修改所有内容,因此无论您将其安装在何处,它都可以正常工作。