为什么virtualenv没有创建DLLs文件夹?

时间:2011-07-11 22:39:05

标签: python windows dll pydev virtualenv

我想知道virtualenv创建DLLs文件夹的原因是什么,与创建LibScripts文件夹的方式相同?

当我遇到PyDev的以下问题时,问题就出现了;
我将我的一个virtualenvs设置为Python解释器,一切都没问题,只有一个例外。我一直收到来自select模块的所有导入的未解决导入的警告。这是因为select模块与大多数其他模块不同,仅存在于DLLs文件夹中。

2 个答案:

答案 0 :(得分:8)

我对此主题进行了一些调查。我从 techtonik的语句开始 - 答案很简单 - 没有人实现它。然而,这又引出了另一个问题 - 为什么没有人实现它?我怀疑答案是因为它有效。这导致了另一个问题 - 它为什么有效?

没有将DLLs文件夹复制到virtualenv中的一切正常的原因是

  • Python搜索sys.path以查找所需的任何dll
  • virtualenv激活后,
  • sys.path包含原始DLLs文件夹的路径

可以通过从DLLs删除sys.path文件夹的路径并尝试导入select模块(此模块需要来自{{1的select.pyd文件来简单地测试第一个语句然后失败的文件夹。

在评论中你说我想将Python模块的DLL与Python代码一起保存在虚拟环境中。只需将DLLs文件夹复制到virtualenv即可。这有效的原因是,在virtualenv激活之后DLLs还包含了virtualenv中sys.path文件夹的路径(虽然在创建virtualenv时没有创建这样的文件夹)。此路径位于原始DLLs文件夹的路径之前,这意味着它首先被搜索,因此会覆盖原始DLLs文件夹。

我在Python的邮件列表中发布了一个名为DLLs folder on Windows的问题。

答案 1 :(得分:3)

国际海事组织有更多理由:

  • 安全性:在某些环境中,策略是拒绝从随机位置执行/加载内容,以防止安全漏洞。因此,
  • 有点着名的DLL load order,可防止加载恶意dll :)。另请参阅here

HTH,