如何创建可重定位的 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,但没有找到任何有用的信息。
我想做的主要步骤
- 创建一个conda环境,用pip或者conda安装一些包,我自己的python包括包
- 将环境文件夹复制到另一台计算机
- 运行本机未安装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 将修改所有内容,因此无论您将其安装在何处,它都可以正常工作。
我想做一个可重定位的环境。所以我需要在包安装中使用相对路径。为此,我只是创建了一个像这样的 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,但没有找到任何有用的信息。
我想做的主要步骤
- 创建一个conda环境,用pip或者conda安装一些包,我自己的python包括包
- 将环境文件夹复制到另一台计算机
- 运行本机未安装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 将修改所有内容,因此无论您将其安装在何处,它都可以正常工作。