【问题标题】:How to create a Relocatable Conda Environment? Is it doable?如何创建可重定位的 Conda 环境?可行吗?
【发布时间】:2019-01-13 19:48:13
【问题描述】:

我想做一个可重定位的环境。所以我需要在包安装中使用相对路径。为此,我只需创建一个这样的 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 上的可重定位环境还不可能

【问题讨论】:

  • 1) 为什么要安装两次? 2)“并将其移动到另一个位置,出现在应用程序中的路径是” - 请为这两个语句提供示例输出,不清楚您将什么移动到哪里以及哪些路径“出现”以及在哪里。
  • 所以您想要一个可以在一个地方设置的 Conda 环境,然后当您将整个环境移动到另一个地方时仍然可以工作?看起来您可能想要这个未实现的 conda 功能:github.com/conda/conda/issues/3097
  • @ivan_pozdeev @interfect 不完全是。我想要的是在我的计算机中创建一个环境,假设路径C:\path\to\my\environment,将文件夹复制到另一台装有 Windows 的计算机,并使其在其他 Windows 中以不同的路径 C:\Users\MyUser\AppData\Roaming\MyApp 运行。这个其他窗口不应该安装 python 或 conda。所以环境本身应该是可运行的
  • 其实一个独立的安装程序是完美的解决方案,但我不知道是否可能,因为完整的应用程序是用Nodejs、JavaScript和python创建的。有没有办法创建一个exe 文件来安装所有这些内容?
  • 你试过没有-epip install吗?

标签: python pip virtualenv setuptools conda


【解决方案1】:

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

由于您需要在包中添加所有文件夹,因此您需要修改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 构建了环境,因为在我的情况下这些包要轻得多。 p>

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

环境中的一些python脚本在头部有绝对路径#!

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

我刚刚删除了它们,因为如果我使用当前位于环境 those headers are ignored 中的 python.exe 调用任何脚本

更新

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

conda-pack 是一个用于创建可重定位 conda 环境的命令行工具。这对于在一致的环境中部署代码很有用,可能在尚未安装 python/conda 的位置。

【讨论】:

  • conda-pack 如果源环境路径和目标环境路径相同,则可以工作。
  • 这不是真的。 conda-pack 的全部意义在于使其可重定位,但您必须激活环境并运行 conda-unpack 来重写前缀。
【解决方案2】:

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

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

【讨论】:

  • 我知道。但这并不是要重新定位环境,而是从头开始安装它。另外,如果您检查第 3 点,我在我的问题中写道:“在未安装 conda 和 python 的这台计算机上运行应用程序”。我需要一个几乎没有计算机知识的最终用户应该知道如何安装它。例如,为 Windows 创建一个exe 安装程序就是一种解决方案。我也在使用 Electron,因此在安装程序中包含一个可重定位的环境(使用 electron-builder)是我找到的最佳解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 2017-09-05
  • 2017-04-02
  • 2015-01-26
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多