Как локально разработать пакет Python? - PullRequest
0 голосов
/ 09 сентября 2018

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

Я клонировал модуль github и внес изменения, но я не уверен, как импортировать локальный пакет вместо уже установленного.

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Подход ответа с помощью abc , добавляющего путь к модулю в системный путь, подходит для локального мгновенного тестирования, но это не полное решение, например, когда необходимо скомпилировать код C или выполнить команду должны быть установлены крюки Для полного теста вы можете вместо этого установить пакет.

Типичный Python имеет setup.py и может быть упакован в дистрибутивный файл (wheel, ...), который затем может быть установлен локально из локального файла.

Рабочий процесс будет:

  • создать распространяемый пакет (может включать команду типа python setup.py bdist_wheel)
  • создание новой виртуальной среды для тестирования (или удаление любой ранее установленной неизмененной версии пакета)
  • установить пакет из локально созданного дистрибутива (может быть просто pip install --no-index --find-links=..)
  • запустить тесты

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

0 голосов
/ 10 сентября 2018

Самый простой способ выполнить такое тестирование - создать виртуальную среду, а затем установить пакет в режиме разработки .

Если вы работаете в Linux, это будет выглядеть примерно так.

$ virtualenv dev_env
$ source dev_env/bin/activate
$ cd ~/project_folder
$ pip install -e .

Этот рабочий процесс не будет перезаписывать уже установленный пакет в вашей системе. Другие, возможно, даже более простые альтернативы будут просто использовать IDE, например PyCharm , который обрабатывает большую часть этого для вас.

0 голосов
/ 10 сентября 2018

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

# activate the virtual environment in ~/vpy
. $HOME/vpy/bin/activate

# install my app and its dependencies
cd $HOME/src/myapp
pip install -e .

# use my forked library instead
cd $HOME/src/forkedlib
pip install -e .
pytest # or whatever tests the forked lib has

# try it out with my application too
cd $HOME/src/myapp
pytest # or whatever tests your app has
myapp

pip install -e делает что-то магическое, так что всякий раз, когда вы import модуль в библиотеке, он направляется прямо в извлеченное дерево исходных текстов, так что если вы вносите изменения в forkedlib, а затем повторно запускаете myapp, вы увидите эти изменения напрямую.

Когда вы закончите, вы можете pip uninstall forkedlib и затем повторно запустить pip install -e ., чтобы переустановить (объявленные) зависимости вашего приложения. (Или удалите и заново создайте виртуальную среду, если это проще.)

0 голосов
/ 09 сентября 2018

Один из способов заключается в использовании sys.path () .
Например:

import sys
sys.path.insert(0, path/to/module)

Таким образом, вы отдает приоритет определенному пути при поиске модуля.
Это означает, что модуль, который вы хотите импортировать, будет сначала найден в path/to/module, а затем в других каталогах, уже в sys.path.

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

Примечание : Для целей разработки вы должны использовать virtualenv, как предложено @eandersson.

...