Src 布局在导入中分配 .src 前缀?在 PyCharm 终端中激活 venv 以进行开发安装

bad*_*der 5 python pip setuptools setup.py pycharm

我想了解什么是使用 setuptools 与“src/layout”的正确简约方法,以免除src.在导入中使用前缀的方式?

\n

我已经阅读了大部分PyPAsetuptools文档(及其许多用例),但我无法理解什么是执行此示例的正确方法。

\n

下面的布局重现了我想要实现的目标。我无法理解如何让第二个导入而不是第一个在mylibrary包的所有模块中工作:

\n
from src.mylibrary.hello_word import hello_function # <- This works.\nfrom mylibrary.hello_word import hello_function  # <- How to get this working?\n\nhello_function()\n
Run Code Online (Sandbox Code Playgroud)\n

使用此目录/文件结构:

\n
C:\\MyProject\n\xe2\x94\x82\n\xe2\x94\x82   setup.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80src\n    \xe2\x94\x82\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80mylibrary\n    \xe2\x94\x82      hello_word.py\n    \xe2\x94\x82      module_two.py\n    \xe2\x94\x82      __init__.py\n    \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n

当我使用开发模式安装时pip install -e .,egg 目录将添加到上面的树中:

\n
    \xe2\x94\x82 (...)\n    \xe2\x94\x82 \n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80mylibrary.egg-info\n           dependency_links.txt\n           PKG-INFO\n           SOURCES.txt\n           top_level.txt\n
Run Code Online (Sandbox Code Playgroud)\n

有了这个setup.py

\n
C:\\MyProject\n\xe2\x94\x82\n\xe2\x94\x82   setup.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80src\n    \xe2\x94\x82\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80mylibrary\n    \xe2\x94\x82      hello_word.py\n    \xe2\x94\x82      module_two.py\n    \xe2\x94\x82      __init__.py\n    \xe2\x94\x82\n
Run Code Online (Sandbox Code Playgroud)\n

hello_world.py我想在导入时不必编写的简单模块src.

\n
    \xe2\x94\x82 (...)\n    \xe2\x94\x82 \n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80mylibrary.egg-info\n           dependency_links.txt\n           PKG-INFO\n           SOURCES.txt\n           top_level.txt\n
Run Code Online (Sandbox Code Playgroud)\n

留空__init__.py

\n

我正在使用 venv,令我惊讶的是,egg 符号链接没有写入 venv,sitepackages而是写入C:\\Users\\Name\\AppData\\Roaming\\Python\\Python38\\site-packages...

\n

Python 控制台指示mylibrary已找到包:

\n
from setuptools import setup, find_packages, find_namespace_packages\n\nsetup(\n    name=\'mylibrary\',\n    version=\'0.1\',\n    package_dir={\'\': \'src\'},\n    # packages=find_namespace_packages(where=\'src\'),  # <- I suppose this isn\'t the deciding factor.\n    packages=find_packages(where=\'src\'),\n)\n
Run Code Online (Sandbox Code Playgroud)\n

bad*_*der 2

所描述的问题是由于必须在 PyCharm 终端内激活 venv造成的。

下面是您可能会遇到的场景的描述。(问题并不是立即显而易见,因为与终端不同,调试、运行等功能以无缝方式集成了 venv。)

需要注意的是:

  • 在开发模式-v下安装时使用 verbose 标志可以提供pipsetuptools尝试执行的操作的线索。

  • 决定性的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)
Run Code Online (Sandbox Code Playgroud)

这将安装到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)
Run Code Online (Sandbox Code Playgroud)

这将安装到site-packages(注意路径)您的 venv 之外以及 Python 基本安装之外。您可能想要避免的事情,因为PyCharm在完成后将无法识别开发安装。

注意:终端中的消息“(...) site-packages is not writeable”是指site-packages您的 Python 基础安装中的。但是,如果没有显式激活 venv ,即使您将权限设置为可写,开发安装也不会写入您的 venv site-packages

选项 3.以用户身份运行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)
Run Code Online (Sandbox Code Playgroud)

您确实在您的 venv 中写入了此处site-packages,这可能就是您想要的。