У нас возникли некоторые неприятные проблемы с 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
Любая идея, что и почему это может быть? Уже будучи в состоянии точно знать, кто и когда будет модифицировать этот файл, поможет любой предлагаемый инструмент?
EDIT: Я пытаюсь использовать 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 как процесс, изменяющий файл, а не многое другое.
Хорошо, я должен сказать, что я не смог воспроизвести это до сих пор в PyDev... знаете ли вы, что только в вашей машине (или у кого-то другого тоже есть такая же проблема)?
Чтобы попытаться воспроизвести его, можете ли вы дать более подробную информацию о своей toolchain: какая ваша версия python и какая версия setuptools? Какие пакеты вы установили? (я чувствую, что виновник на самом деле не Eclipse/PyDev, а какой-то пакет python, который это делает).
Просто отметим, что PyDev просто не делает ничего, связанного с.pth файлами - все, что он делает, запускает ваш скрипт python с настройкой PYTHONPATH в переменных среды для запущенного процесса (так что очень маловероятно, что PyDev пишет этот файл - просто потому, что он ничего не знает о файлах.pth).
Одна вещь, которая может помочь в достижении ее корня: вы можете попытаться сделать этот файл неприемлемым (вы должны иметь возможность изменять свои разрешения, чтобы вы не могли его изменить), затем попытайтесь воспроизвести и посмотреть, получаете ли вы некоторые где-то ошибка (потому что если кто-то попытается написать ее, будет исключение, потому что вы не получите разрешения на это).
Так как вы находитесь на окнах, почему бы не использовать монитор процесса? Включите его, отфильтруйте файлы, а затем установите. Он будет регистрировать, кто касается файла и в какой последовательности. Это должно найти вашего виновника.
Я действительно не нашел исправления для реальной проблемы, но, по крайней мере, я нашел workardound.
Теперь я должен хранить в текстовом файле все имена яиц, которые должны находиться в sys.path во время выполнения. Прежде чем делать что-либо еще, я беру этот список, присоединяюсь к этим путям с правильным путем пакетов сайтов и добавляю то, что отсутствовало в 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)