我们在Eclipse上遇到了一些恼人的问题,显然一直存在于Windows 7 +自定义python安装+ Eclipse 3.7和最新的Pydev。
问题基本上是,如果在设置python解释器时也添加了所有库,那么Eclipse或Pydev或者谁知道从全局easy_install.pth文件中删除所有这些条目,也在Pydev中配置。 这意味着在Eclipse中一切正常,但是它之外的任何东西都不可能正常工作。
现在我发现很难相信没有人注意到,所以我认为我们做错了什么。
我还填写了一个没有引起太多关注的错误:
https://sourceforge.net/tracker/?func=detail&aid=3446052&group_id=85796&atid=577329
知道它可能是什么以及为什么? 已经能够确切地知道修改该文件的人和修改时间对于任何建议的工具有用吗?
编辑: 我正在尝试使用Process Monitor,如下所示。 所以我启动Eclipse,我运行一个简单的Python命令,我得到类似这样的文件。
“文件时间”,“事件总数”,“打开”,“关闭”,“读取”,“写入”,“读取字节”,“写入字节”,“获取ACL”,“设置ACL”,“其他”,‘路径’ “0.0000306”, “4”, “1”, “1”, “0”, “0”, “0”, “0”, “0”, “0”, “2”,“C:\ python25 \ LIB \站点包\易于install.pth“
所以基本上它是开放的:1,关闭:1,其他:2。 该文件实际上已被修改。
我的印象是Eclipse只是愚蠢地覆盖了文件,否则应该还有一些读操作,对吧?
然而,这对我没有多大帮助,我只能将Eclipse视为修改文件的过程,而不是其他。
答案 0 :(得分:3)
好的,我必须说到目前为止我还没有能够在PyDev中重现这个...你知道这是否只发生在你的机器上(或者其他同事也有同样的问题)?
要尝试重现它,您能否提供有关工具链的更多详细信息:您的python版本是什么以及您的setuptools版本是什么?你安装了哪些包? (我的感觉是罪魁祸首不是真正的Eclipse / PyDev,而是一些正在这样做的python包。)
请注意,PyDev根本不做与.pth文件有关的任何事情 - 所有这一切都是在启动过程的环境变量中使用PYTHONPATH设置启动你的python脚本(因此,PyDev不太可能写这个文件 - 只是因为它不知道与.pth文件有关的任何内容。)
有一件事可以帮助找到它的根源:您可以尝试使该文件不可写(您应该能够更改其权限,以便您不能修改它),然后,尝试重现并查看是否你在某处得到了一些错误(因为如果有人试图写它,会有一个例外,因为你没有获得这样做的权限)。
答案 1 :(得分:2)
由于您在Windows上,为什么不使用process monitor?打开它,过滤您的文件,然后安装。它将记录触摸文件的人,以及按什么顺序。那应该找到你的罪魁祸首。
答案 2 :(得分:0)
我还没有真正找到真正问题的解决办法,但至少我发现了一个问题。
我现在要做的是在运行时将所有应该在sys.path中的egg名称存储在文本文件中。 在做任何其他事情之前,我采用这个列表,使用正确的站点包路径加入这些路径,并将缺少的内容添加到sys.path中。
它似乎有效,但是如果我删除了一些库(比如pyqt),即使它们被添加了,我仍然会得到som错误,所以仍然有些东西丢失......
import pkg_resources
import sys
from distutils.sysconfig import get_python_lib
from os import path
from psi.devsonly.utils import filename_to_list
#TODO: there appears to be an issue with QT removing the entries
def update_sys_path():
"""Make sure that the sys path contains all the entries needed
"""
site_packages = get_python_lib()
req = pkg_resources.Requirement.parse('psi.devsonly')
wea = pkg_resources.resource_filename(req, 'windows_easy_install.pth')
ppack_list = filename_to_list(wea)
for p in ppack_list:
full_name = path.join(site_packages, p)
# the lower() is necessary or the entries are not found
if full_name.lower() not in sys.path:
print("adding to the path the entry %s" % full_name)
sys.path.insert(0, full_name)
else:
print("%s already present in the path" % full_name)