Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将PySide正确安装到可重新定位的virtualenv中?_Python_Virtualenv_Pyside - Fatal编程技术网

Python 如何将PySide正确安装到可重新定位的virtualenv中?

Python 如何将PySide正确安装到可重新定位的virtualenv中?,python,virtualenv,pyside,Python,Virtualenv,Pyside,我正在pip将PySide安装到virtualenv中: sudo virtualenv --always-copy $VENV source $VENV/bin/activate sudo $VENV/bin/pip install pyside sudo $VENV/bin/python $VENV/bin/pyside_postinstall.py -install deactivate virtualenv工作得很好,我可以毫无问题地运行Python/PySide脚本: $VENV/b

我正在pip将PySide安装到virtualenv中:

sudo virtualenv --always-copy $VENV
source $VENV/bin/activate
sudo $VENV/bin/pip install pyside
sudo $VENV/bin/python $VENV/bin/pyside_postinstall.py -install
deactivate
virtualenv工作得很好,我可以毫无问题地运行Python/PySide脚本:

$VENV/bin/python $SCRIPT
现在,我让我的virtualenv可重新定位:

virtualenv --relocatable $VENV
我谨动议:

mv $VENV $VENV_RELOCATED
…然后再次运行我的脚本:

source $VENV_RELOCATED/bin/activate
$VENV_RELOCATED/bin/python $SCRIPT
这一次,我遇到了一个错误:

Traceback (most recent call last):
  File "script.py", line 1, in <module>
    from PySide import QtCore, QtGui, QtUiTools
ImportError: dlopen(/absolute/path/to/relocated_venv/lib/python2.7/site-packages/PySide/QtCore.so, 2): Library not loaded: @rpath/libpyside-python2.7.1.2.dylib
  Referenced from: /absolute/path/to/relocated_venv/lib/python2.7/site-packages/PySide/QtCore.so
  Reason: image not found
请注意:错误消息中打印两次的绝对路径是$VENV_

所有这些都是在OS X 10.11.0上使用Python 2.7.10和PySide 1.2.2实现的


问题:我应该如何将PySide正确安装到可重新定位的virtualenv中?

下一个PySide版本(发布时可能标记为“1.2.3”)修复了以下问题:

然而,我也让PySide1.2.2在OSX10.11(ElCapitan)上的可重新定位的virtualenv中工作。为此,我修改了$VIRTUALENV/bin/pyside\u postinstall.py脚本中的
localize_libpaths()
函数

修补程序详细信息:如果在执行脚本时检测到virtualenv,它将不会使用
@rpath
。相反,它将使用
@executable\u path
并从virtualenv中的python二进制文件进行相对搜索。由于PySide模块始终安装在virtualenv中的同一位置,因此我认为这应该适用于所有场景

def localize_libpaths(libpath, local_libs, enc_path=None):
    """ Set rpaths and install names to load local dynamic libs at run time

    Use ``install_name_tool`` to set relative install names in `libpath` (as
    named in `local_libs` to be relative to `enc_path`.  The default for
    `enc_path` is the directory containing `libpath`.

    Parameters
    ----------
    libpath : str
        path to library for which to set install names and rpaths
    local_libs : sequence of str
        library (install) names that should be considered relative paths
    enc_path : str, optional
        path that does or will contain the `libpath` library, and to which the
        `local_libs` are relative.  Defaults to current directory containing
        `libpath`.
    """
    if enc_path is None:
        enc_path = abspath(dirname(libpath))
    install_names = osx_get_install_names(libpath)
    need_rpath = False
    for install_name in install_names:
        if install_name[0] in '/@':
            continue
        if hasattr(sys, 'real_prefix'):
            # virtualenv detected - use @executable_path
            back_tick('install_name_tool -change %s @executable_path/../lib/python2.7/site-packages/PySide/%s %s' %
               (install_name, install_name, libpath))
        else:
            # not a virtualenv - use @rpath
            back_tick('install_name_tool -change %s @rpath/%s %s' %
               (install_name, install_name, libpath))
            need_rpath = True
    if need_rpath and enc_path not in osx_get_rpaths(libpath):
        back_tick('install_name_tool -add_rpath %s %s' %
           (enc_path, libpath))

在Windows上,重新定位包含PySide的virtualenv没有问题。然而,对于Linux,我还没有找到解决方案。我想等待PySide 1.2.3是一个不错的选择。

这只是一个问题,首先你为什么需要
sudo
sudo
virtualenv所必需的-
。我还尝试不使用
sudo
,而是手动将符号链接转换为文件。这很好,但仍然产生PySide错误,我需要帮助。你能澄清吗?我可以运行
virtualenv-3.4——始终复制测试
,并且运行良好。听起来这个问题好像少了点什么。当然。如果我不使用
sudo
,就会发生这种情况:–但是,我更愿意将PySide放在一个可重新定位的virtualenv中工作。
virtualenv
的要点是,你永远不需要使用
sudo
。您的文件系统可能出了问题,您之前使用
sudo
运行了一些命令,从而破坏了文件权限?
def localize_libpaths(libpath, local_libs, enc_path=None):
    """ Set rpaths and install names to load local dynamic libs at run time

    Use ``install_name_tool`` to set relative install names in `libpath` (as
    named in `local_libs` to be relative to `enc_path`.  The default for
    `enc_path` is the directory containing `libpath`.

    Parameters
    ----------
    libpath : str
        path to library for which to set install names and rpaths
    local_libs : sequence of str
        library (install) names that should be considered relative paths
    enc_path : str, optional
        path that does or will contain the `libpath` library, and to which the
        `local_libs` are relative.  Defaults to current directory containing
        `libpath`.
    """
    if enc_path is None:
        enc_path = abspath(dirname(libpath))
    install_names = osx_get_install_names(libpath)
    need_rpath = False
    for install_name in install_names:
        if install_name[0] in '/@':
            continue
        if hasattr(sys, 'real_prefix'):
            # virtualenv detected - use @executable_path
            back_tick('install_name_tool -change %s @executable_path/../lib/python2.7/site-packages/PySide/%s %s' %
               (install_name, install_name, libpath))
        else:
            # not a virtualenv - use @rpath
            back_tick('install_name_tool -change %s @rpath/%s %s' %
               (install_name, install_name, libpath))
            need_rpath = True
    if need_rpath and enc_path not in osx_get_rpaths(libpath):
        back_tick('install_name_tool -add_rpath %s %s' %
           (enc_path, libpath))