【问题标题】:virtualenv that can find relocated libraires (like mysqlclient lib for MySQLdb)virtualenv 可以找到重新定位的库(如 MySQLdb 的 mysqlclient lib)
【发布时间】:2014-05-11 08:39:08
【问题描述】:

我希望能够共享一个自包含的 virtualenv,即确保安装的所有脚本都能够直接运行而无需设置任何内容。 例如。我在使用 MySQL-python 的 virtualenv 中安装了一个脚本。不幸的是,导入 MySQLdb 会寻找一个共享库 (libmysqlclient.so),该库已移动到我系统上标准目录之外的其他位置。 有没有办法保证我的 virtualenv 每次有人使用它时都能找到该库?

【问题讨论】:

    标签: python mysql shared-libraries virtualenv mysql-python


    【解决方案1】:

    这可能不是最好的解决方案,但你可以破解 virtualenv 活动脚本来设置一些环境变量(这是一个我们无论如何都需要使用的脚本)。 在virtualenv的安装脚本中,我添加了:

    echo 'export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH' >> /path/to/virtualenv/activate
    

    现在每次有人使用我的 virtualenv 时,它还包括 LD_LIBRARY_PATH 来查找 mysql 库。

    我可以看到的缺点:

    • 不能很好地使用 virtualenv 的 deactivate

    • 如果您想使用标准 distutils setup.py 分发您的软件包,这将无济于事。

    【讨论】:

      【解决方案2】:

      我知道这个问题有点老了,但我很乐意分享我的解决方案,因为无法通过 Google 找到它:

      deactivate () 函数中,添加以下行:

          if ! [ -z ${_OLD_LD_LIBRARY_PATH+x} ] ; then
              LD_LIBRARY_PATH="$_OLD_LD_LIBRARY_PATH"
              export LD_LIBRARY_PATH
              unset _OLD_LD_LIBRARY_PATH
          fi
      

      请注意,我使用的是否定的 -z 表达式 - PATHPYTHONHOME 的现有重置脚本使用 -n,如果 _OLD_LD_LIBRARY_PATH 设置为空字符串,则其计算结果错误为 false。

      然后,在deactivate () 函数下方,添加以下部分:

      _OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
      LD_LIBRARY_PATH="$VIRTUAL_ENV/lib:$LD_LIBRARY_PATH"
      export LD_LIBRARY_PATH
      

      【讨论】:

        猜你喜欢
        • 2023-04-05
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        • 2021-08-25
        • 2011-11-01
        • 2010-12-13
        • 1970-01-01
        • 2016-05-13
        相关资源
        最近更新 更多