Вчера я отредактировал скрипт bin/activate моего virtualenv так, чтобы он устанавливал переменную среды PYTHONPATH для включения версии разработки какого-либо внешнего пакета. Я должен был сделать это, потому что setup.py пакета использует distutils и не поддерживает команду develop а-ля setuptools. Настройка PYTHONPATH работает нормально, если речь идет об использовании интерпретатора Python в терминале.

Однако только сейчас я открыл настройки проекта в PyCharm и обнаружил, что PyCharm не знает о рассматриваемом внешнем пакете - PyCharm не перечисляет ни внешний пакет, ни его путь. Естественно, это потому, что PyCharm не (и не может надежно) анализировать или исходить сценарий bin/activate. Я мог бы вручную добавить путь в настройках проекта PyCharm, но это означает, что я должен повториться (один раз в bin/activate, а затем в настройках проекта PyCharm). Это не СУХОЙ и это плохо.

Создание site-packages символической ссылки, которая указывает на внешний пакет, почти идеально. Таким образом, по крайней мере, редактор исходного кода PyCharm может найти пакет, как и интерпретатор Python в терминале. Тем не менее, каким-то образом PyCharm все еще не перечисляет пакет в настройках проекта, и я не уверен, что можно оставить его таким.

Итак, как я могу добавить внешний пакет в мой virtualenv / проект таким образом, чтобы…

  1. Я не должен повторяться; и…
  2. и интерпретатор Python, и PyCharm будут знать об этом?
5
Kal 1 Фев 2013 в 17:26

3 ответа

Лучший ответ

Даже когда пакет не использует setuptools pip обезьянные патчи setup.py, чтобы заставить его использовать setuptools.

Может быть, вы можете удалить этот PYTHONPATH хак и pip install -e /path/to/package.

1
Hugo Tavares 2 Фев 2013 в 12:14

Это улучшение ответа 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
-1
Beefster 2 Сен 2019 в 17:11

Одним из вариантов является добавление пути динамически:

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

Но это не лучшее решение, потому что очень вероятно, что этот код не попадет в окончательную версию приложения. Еще один вариант (и более подходящий imho) - создать простой файл setup.py для пакета и развернуть его в virtualenv с параметром Develop или с помощью параметра -e в pip:

python setup.py develop 

Или же:

pip install -e /path/to/your/package/directory

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

-1
ndpu 2 Сен 2019 в 10:01