2009-11-05 1 views
1

Я внес некоторые изменения в модуль python в извлеченную копию репозитория и вам нужно их протестировать. Однако, когда я пытаюсь запустить скрипт, который использует этот модуль, он сохраняет импорт модуля из сундука репозитория, что бесполезно для меня.Как сделать Python выбрать правильный модуль без ручной модификации sys.path?

Я попытался установить PYTHONPATH, который ничего не сделал. После некоторого поиска, я обнаружил, что что-либо в файлах .pth в каталоге site-packages будет помещено даже до PYTHONPATH (что для меня поражает цель его наличия). Я считаю, что это причина того, что мой модуль не будет выбран.

Правильно ли я? Если да, то каков способ переопределить это (без изменения сценария, чтобы иметь sys.path.insert(0,path))?

Редактировать: В ответ на NicDumz - исходный репозиторий находился под /projects/spam. Модули python были частью этого в /projects/spam/sources/python/a/b/. Тем не менее, они «строятся» каждую ночь, используя вариант доморощенного макета, который затем помещает их в /projects/spam/build/lib/python/a/b/. Сценарий использует модуль только для этого последнего пути.
Я проверил весь репозиторий до /home/sundar/spam и внесла изменения в /home/sundar/spam/sources/python/a/b/mymodule.py. Я установил свой PYTHONPATH в /home/sundar/spam/sources/python и попытался сделать import a.b.mymodule без успеха.

+0

Я думаю, что остроумие было бы проще с более длинным описанием вашей среды. Где установлен модуль соединительной линии? Как он был установлен? И затем, для вашей копии, вы только скопировали небольшой подмодуль или все дерево? где он был помещен? и т. д. – NicDumZ

ответ

2

Вы можете написать небольшой скрипт, такой как приведенный ниже, который префикс sys.path, а затем установить PYTHONSTARTUP для использования этого сценария.

import sys 
sys.path.insert(0, 'c:/temp') 

Например ...

C:\temp>set PYTHONSTARTUP=c:\temp\tst.py 
C:\temp>C:\Python26\python 
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on 
win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.path 
['c:/temp', '', 'C:\\Python26\\lib\\site-packages\\setuptools-0.6c9-py2.6.egg', 
'C:\\Python26\\lib\\site-packages\\pyyaml-3.08-py2.6-win32.egg', 'C:\\Python26\\ 
lib\\site-packages\\pyglet-1.1.3-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\ 
simpy-2.0.1-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\nose-0.11.1-py2.6.egg 
', 'C:\\Python26\\lib\\site-packages\\mercurial-unknown-py2.6-win32.egg', 'c:\\t 
emp', 'C:\\WINDOWS\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26 
\\lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python2 
6', 'C:\\Python26\\lib\\site-packages', 'C:\\Python26\\lib\\site-packages\\win32 
', 'C:\\Python26\\lib\\site-packages\\win32\\lib', 'C:\\Python26\\lib\\site-pack 
ages\\Pythonwin'] 
+1

К сожалению, PYTHONSTARTUP, по-видимому, не подхвачен, когда интерпретатор Python запускается не интерактивно. Есть ли способ запустить скрипт (вместе с его аргументами командной строки) из интерактивного интерпретатора? Если это так, это решение будет работать для меня. – sundar

2

Похоже, вам нужно установить virtualenv и использовать его для создания различных сред для различных целей. В одной среде вы будете импортировать модули из магистрали репозитория, но в другой среде у вас будет смесь модулей магистралей и тестовых модулей.

Сохраняя все, как это сделать, вы упрощаете изменения отката (просто удалите всю папку виртуальной среды), и вы значительно снижаете риск того, что ваше тестовое оснащение будет передано в хранилище.

+0

Но это создаст проблему сохранения двух сред в синхронизации, не так ли? Кроме того, я вижу, что я могу заставить virtual-env не видеть глобальные пакеты сайтов, но это не то, что я хочу - мне нужно, чтобы мои модули переопределяли глобальные, когда есть конфликт, и в противном случае выбирайте их. Это возможно? – sundar

+0

Вы не хотите, чтобы две среды были синхронизированы. Вы хотите, чтобы одна среда запускала код репозитория, когда он был извлечен. В другой среде будут некоторые измененные модули, над которыми вы сейчас работаете. Когда вы закончите свою работу, вы удалите среду secong. Чтобы начать работу с другим набором модулей, скопируйте среду репозитория и начните изменять ситуацию. В рабочей среде вы можете установить любые пакеты и модули, которые вы хотите, и отредактировать их также, и они будут переопределять что-либо в репозитории. –

+0

В любое время вы можете оставить свою виртуальную среду разработки для запуска неизмененного кода репозитория, а затем вернуться в виртуальную среду разработки, чтобы протестировать свои собственные изменения кода. Когда ваши изменения будут завершены, вы просто скопируете их в выгруженный репозиторий, запустите модульные тесты еще раз и скопируйте их. –

0

Вы можете создать сценарий установки с setuptools или distribute, затем выполните python setup.py develop. Он добавит ссылку на вашу рабочую копию в файл .pth, переопределяя любую установленную версию.

Когда вы закончите, вы можете просто удалить ссылку в файле .pth.

1

Ваш текущий рабочий каталог является первым в sys.path. Все, что там ковыряет что-то еще на пути.

Скопируйте «тестовую версию» в какое-то место ближе к началу списка каталогов в sys.path, как и текущий рабочий каталог.