3

我的 python 工作区中有两个需要 sip.pyd 的模块
Module1.pyd 需要 sip.pyd(实现 v 8.0-8.1)
Module2.pyd 需要 sip.pyd(另一个文件,实现 v6.0)

所以我不能只选择较新的,这是行不通的:我必须同时保留它们!

(RuntimeError: the sip module implements API v6.0 but the fbx module requires API v8.1)

如何以 .pyd 扩展名(python dll,不可编辑)导入模块,并指定要获取哪个 sip.pyd?

至于解决方法,我设法做到了:

  1. 一个 sip.pyd 在我的根站点包位置。
  2. 如果我必须导入需要其他 sip.pyd 的模块,我会从 sys.path 中删除根路径,并在其他 sip.pyd 所在的位置附加精确的文件夹路径。
  3. 我可以导入我的模块并恢复以前的 sys.path。
4

3 回答 3

1

VirtualEnv用于处理这些情况。

virtualenv 是一个创建隔离 Python 环境的工具。

使用 virtualenv,您将能够创建 2 个环境,一个在 8.x 版本中带有 sip.pyd,另一个在 6.0 版本中

于 2011-11-28T16:43:16.513 回答
1

假设您没有一段代码同时需要两个文件。我推荐以下内容:

  • 将这两个文件安装在 2 个单独的目录中(称它们为 egsip-6.0sip-8.0),您将放置在site-packages/

  • sip_helper.py用看起来像的代码编写一个文件

sip_helper.py 内容:

import sys
import re
from os.path import join, dirname
def install_sip(version='6.0'):
    assert version in ('6.0', '8.0'), "unsupported version"
    keep = []
    if 'sip' in sys.modules:
       del sys.modules['sip']
    for path in sys.path:
        if not re.match('.*sip\d\.\d', path):
            keep.append(path)
    sys.path[:] = keep # remove other paths
    sys.path.append(join(dirname(__file__), 'sip-%s' % version))
  • 将 sip_helper.py 放入 site_packages(sip-6.0 和 sip-8.0 目录的父目录)
  • sip_helper.install_sip在程序启动时调用
于 2011-11-28T16:50:15.433 回答
0

我不知道这是否有效(如果模块的名称必须与其内容匹配),但你不能将它们重命名为sip6.pydresp。sip8.pyd然后做

if need6:
    import sip6 as sip
else:
    import sip8 as sip

?

于 2011-11-28T16:56:28.140 回答