【问题标题】:Python: how to deal with several .pyd dependencies with the same name?Python:如何处理多个同名的 .pyd 依赖项?
【发布时间】:2012-01-08 02:19:56
【问题描述】:

我的 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。

【问题讨论】:

    标签: python import dependencies python-sip pyd


    【解决方案1】:

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

    • 将这两个文件安装在 2 个单独的目录中(称它们为 sip-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

    【讨论】:

    • 谢谢,效果很好!如果我有,在相同的代码中,我可以在 sip 之间切换:try: import ModuleX except: sip_helper.install_sip() import ModuleX
    【解决方案2】:

    VirtualEnv 已完成处理这些情况。

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

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

    【讨论】:

    • 感谢您的提示!由于我使用了其他解决方案,我发现 VirtualEnv 非常有趣!我确定我会在某个时候在其他地方使用它。
    【解决方案3】:

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

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

    ?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      相关资源
      最近更新 更多