Макет sr c для выдачи префикса .sr c при импорте? Активируйте venv в терминале PyCharm для установки при разработке - PullRequest
3 голосов
/ 21 июня 2020

Я хочу понять, что считается правильным минималистичным способом использования setuptools с "src / layout" таким образом, чтобы не использовать префикс src. при импорте?

I прочитал большую часть документации PyPA и setuptools (и ее многочисленные варианты использования), но я не могу понять, что считается правильным способом выполнения этого примера.

Приведенный ниже макет воспроизводит то, чего я хочу достичь. Я не могу понять, как заставить второй импорт работать вместо первого во всех модулях пакета mylibrary:

from src.mylibrary.hello_word import hello_function # <- This works.
from mylibrary.hello_word import hello_function  # <- How to get this working?

hello_function()

Используя эту структуру каталогов / файлов:

C:\MyProject
│
│   setup.py
│
└───src
    │
    ├──mylibrary
    │      hello_word.py
    │      module_two.py
    │      __init__.py
    │

Когда я использую режим разработки установить с помощью pip install -e ., каталог яйца добавляется в приведенное выше дерево:

    │ (...)
    │ 
    └──mylibrary.egg-info
           dependency_links.txt
           PKG-INFO
           SOURCES.txt
           top_level.txt

С этим setup.py:

from setuptools import setup, find_packages, find_namespace_packages

setup(
    name='mylibrary',
    version='0.1',
    package_dir={'': 'src'},
    # packages=find_namespace_packages(where='src'),  # <- I suppose this isn't the deciding factor.
    packages=find_packages(where='src'),
)

Простой модуль hello_world.py, который я хочу избавить от необходимости писать src. при импорте.

def hello_function():
    print("hello world")

__init__.py остается пустым.

Я использую venv, к моему удивлению, символическая ссылка яйца записывается не в venv sitepackages, а в C:\Users\Name\AppData\Roaming\Python\Python38\site-packages ...

Python консоль указывает, что mylibrary найден пакет:

>>> from setuptools import find_packages
>>> find_packages(where='src')
['mylibrary']

1 Ответ

2 голосов
/ 22 июня 2020

Описанная проблема возникает из-за необходимости активировать venv внутри терминала PyCharm .

Описание сценария ios, с которым вы, вероятно, столкнетесь, следует. (Проблема не сразу очевидна, потому что, в отличие от терминала, такие функции, как отладка, запуск и т. Д. c, интегрируют venv без проблем.)

Следует отметить:

  • Использование подробного флага -v при установке в режиме разработки дает подсказки о том, что пытаются сделать pip и setuptools .

  • Решающие сообщения pip основаны на разрешениях на запись вашего site-packages, однако вам не нужно будет изменять какие-либо разрешения по умолчанию при активации Venv на терминал.

  • Если вы используете 1 venv, будут задействованы 3 разных site-packages (обратите внимание на пути).

3 варианты, которые вы, вероятно, попробуете:

Вариант 1. Запустить PyCharm от имени администратора, выполнение следующего из терминала дает:

C:\MyProject>pip install -v -e .

Non-user install because site-packages writeable
(...)
Creating c:\program files\python38\lib\site-packages\mylibrary.egg-link (link to src)

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

Вариант 2. Запустите PyCharm как пользователь. Без активации venv на терминале.

C:\MyProject>pip install -v -e .

Defaulting to user installation because normal site-packages is not writeable
(...)
Creating c:\users\name\appdata\roaming\python\python38\site-packages\mylibrary.egg-link (link to src)

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

ПРИМЕЧАНИЕ. Сообщение в терминале "(...) site-packages не writeable "относится к site-packages в вашей базовой установке Python. Но без явной активации venv, даже если вы установите права доступа на запись, установка для разработки не будет записывать на ваш venv site-packages.

Option 3. Run PyCharm как пользователь. Активация venv на терминале.

(MyProject_venv) C:\MyProject>pip install -v -e .

Non-user install because user site-packages disabled
(...)
Creating c:\myproject_venv\lib\site-packages\mylibrary.egg-link (link to src)

Здесь вы написали на site-packages в своем venv, что, вероятно, именно то, что вы хотите.

...