PYTHONPATH vs符号链接

时间:2013-02-01 13:26:01

标签: python python-2.7 virtualenv pycharm pythonpath

昨天,我编辑了virtualenv的bin/activate脚本,以便设置PYTHONPATH环境变量以包含某些外部包的开发版本。我必须执行此操作,因为程序包的setup.py使用distutils并且不支持develop命令àlasetuptools。设置PYTHONPATH在终端中使用Python解释器时可以正常工作。

然而,刚才我在PyCharm中打开了项目设置,发现PyCharm并不知道有问题的外部包 - PyCharm既没有列出外部包也没有路径。当然,这是因为PyCharm没有(并且不能可靠地)解析或获取bin/activate脚本。我可以在PyCharm项目设置中手动添加路径,但这意味着我必须重复自己(一次在bin/activate,再一次在PyCharm项目设置中)。那不是干,那很糟糕。

site-packages中创建指向外部包的符号链接几乎完美。这样,至少PyCharm的源编辑器可以找到包,终端中的Python解释器也是如此。但是,PyCharm仍然没有在项目设置中列出包,我不确定是否可以这样做。

那么我怎么能以这样的方式将外部包添加到我的virtualenv /项目中......

  1. 我不必重复自己;和...
  2. Python解释器和PyCharm都会注意到它吗?

3 个答案:

答案 0 :(得分:1)

即使某个软件包未使用setuptools pip monkeypatches setup.py强制它使用setuptools

也许您可以删除PYTHONPATH黑客和pip install -e /path/to/package

答案 1 :(得分:0)

一种选择是动态添加路径:

try:
    import foo
except ImportError:
    sys.path.insert(0. "/path/to/your/package/directory")
    import foo

但它不是最佳解决方案,因为该代码很可能无法进入应用程序的最终版本。另一个选项(更合适的imho)是为包创建简单的setup.py文件,并使用develop参数在virtualenv中部署它:

python setup.py develop

http://packages.python.org/distribute/setuptools.html#development-mode

答案 2 :(得分:-1)

这是对ndpu答案的改进,无论实际文件在何处,它都可以使用。

您可以取消引用符号链接,然后在导入本地导入之前设置sys.path

import os.path
import sys

# Ensure this file is dereferenced if it is a symlink
if __name__ == '__main__' and os.path.islink(__file__):
    try:
        sys.path.remove(os.path.dirname(__file__))
    except ValueError:
        pass
    sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))

# local imports go here
相关问题