如何创建可移动的Conda环境?可以吗

时间:2018-08-06 19:41:20

标签: python pip virtualenv setuptools conda

我想创建一个可重定位的环境。因此,我需要在软件包安装中使用相对路径。为此,我只需创建一个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

virtualenv上的等效项为this

virtualenv --relocatable env_folder

但这是一个实验性功能

更新(2018年8月7日)

实际上,我要的是@interfect在他的评论中所说的,问题是here。因此,无法在conda上重定位环境

2 个答案:

答案 0 :(得分:0)

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

由于需要将所有文件夹添加到包中,因此需要修改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脚本在标头上带有#!的绝对路径。

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

我之所以删除了它们,是因为如果我使用those headers are ignored环境中当前的python.exe调用任何脚本,那么

更新

conda-pack也可能有用。我还没有尝试过

  

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

答案 1 :(得分:0)

如果将软件包转换为conda软件包(如果已经在使用pip,则很简单),只需conda将软件包安装在新计算机上,一切将在安装时重新定位。

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