如何/是否可以以可移植的方式安装 python?

les*_*ese 4 linux scripting python portability

我正在编写一个python脚本,该脚本负责将mysql具有特定架构/结构的数据库迁移到postgresql具有不同结构的数据库中。

在开发阶段,我在一个虚拟机(CentOS7)中工作,我的所有环境都正确设置。

目前我在测试阶段,第一次尝试在真实服务器上运行脚本,但是我已经面临不同环境(python版本,或python-modules版本不兼容)导致的麻烦。

由于我必须在许多服务器上执行这个脚本(所有服务器都是 GNU/Linux 服务器,其中大部分是 CentOS,一些是 Debian),我正在寻找一种方法来集成 python 和所有 python 模块(依赖项) 直接进入我的脚本,一种可移植的 python 版本,如果你知道我的意思的话。

例如,我想将以下元素/二进制文件集成到我的脚本包中:

  • 蟒蛇 2.7.5
  • mysql-connector-python-2.1.3-1
  • 蟒蛇psycopg2

小智 5

virtualenv可能是您正在寻找的。请参阅 http://docs.python-guide.org/en/latest/dev/virtualenvs/

虚拟环境是一种工具,通过为它们创建虚拟 Python 环境,将不同项目所需的依赖项保存在不同的位置。它解决了“项目 X 依赖于 1.x 版本,但项目 Y 需要 4.x”的困境,并使您的全局站点包目录保持清洁和可管理。

通过 pip 安装 virtualenv:

$ pip install virtualenv
Run Code Online (Sandbox Code Playgroud)

基本用法

  1. 为项目创建虚拟环境:

    $ cd  my_project_folder 
    $ virtualenv venv 
    
    Run Code Online (Sandbox Code Playgroud)

    virtualenv venv将在当前目录中创建一个文件夹,其中将包含 Python 可执行文件,以及可用于安装其他包的 pip 库的副本。虚拟环境的名称(在本例中为 venv)可以是任何名称;省略名称会将文件放在当前目录中。

    这会在您运行命令的任何目录中创建 Python 的副本,并将其放置在名为 venv 的文件夹中。

    您还可以使用您选择的 Python 解释器。

    $ virtualenv -p /usr/bin/python2.7 venv 
    
    Run Code Online (Sandbox Code Playgroud)

    这将使用 /usr/bin/python2.7 中的 Python 解释器

  2. 要开始使用虚拟环境,需要激活它:

    $ source venv/bin/activate 
    
    Run Code Online (Sandbox Code Playgroud)

    当前虚拟环境的名称现在将出现在提示的左侧(例如 (venv)Your-Computer:your_project UserName$),让您知道它处于活动状态。从现在开始,您使用 pip 安装的任何包都将放置在 venv 文件夹中,与全局 Python 安装隔离。

    像往常一样安装软件包,例如:

    $ pip install requests 
    
    Run Code Online (Sandbox Code Playgroud)

    如果您目前已在虚拟环境中完成工作,您可以停用它:

    $ deactivate
    
    Run Code Online (Sandbox Code Playgroud)

如果你想移动你的环境:

您可以在 virtualenv 中列出已安装的软件包:

    $ pip freeze > requirements.txt
Run Code Online (Sandbox Code Playgroud)

并使用以下命令将它们安装在目标 virtualenv 上:

    $ pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

根据我的经验,可以为 python2 和 python3 创建和管理 virtualenvs(在我的系统上,我有virtualenvvirtualenv3

请注意,virtualenv 本身不提供 python 解释器。它允许您创建已提供 Python 解释器的隔离环境。

恕我直言,将 python 二进制文件捆绑到您的脚本中不仅会使您的包更大,实际上还会使您的脚本不那么便携,因为二进制文件将针对特定的操作系统和 glibc 进行编译。如果有人想在不同的(linux)操作系统/体系结构上使用该脚本,除非您为该版本提供了一个包,否则这是不可能的。