Src 布局在导入时分配 .src 前缀?在 PyCharm 终端中激活 venv 以进行开发安装
- 2025-03-26 09:08:00
- admin 原创
- 15
问题描述:
我想了解什么才是正确的简约方式,即使用带有“src/layout”的setuptools ,以便src.
在导入时无需使用前缀?
我已经阅读了大部分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 .
egg 目录被添加到上面的树中:
│ (...)
│
└──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,令我惊讶的是,egg 符号链接并未写入 venv,sitepackages
而是写入C:UsersNameAppDataRoamingPythonPython38site-packages
......
Python 控制台指示mylibrary
找到了包:
>>> from setuptools import find_packages
>>> find_packages(where='src')
['mylibrary']
解决方案 1:
更新/解决方法
您可以按照此链接中的步骤将文件夹标记为source root
。来自链接:
源根源根图标包含实际的源文件和资源。PyCharm 使用源根作为解析导入的起点
这样我们就不必再安装它或者改变路径了(虽然对我来说这仍然感觉有点棘手)
1.Pycharm出现pip
问题:
每当我pip
在 pycharm 终端中运行时,它都会出于某种原因运行系统pip
。您可以使用命令检查which pip
。但如果我运行python -m pip
它,它会做正确的事情。
2.它实际上应该识别导入:
话虽如此,我真的不知道为什么 pycharm 无法识别没有src.
前缀的导入。我从 github 克隆了 `cryptography 包,它可以正常识别它,src 文件夹会自动添加到路径中,但我不知道怎么做。
无论哪种方式,您的代码都可以按预期工作,无需前缀,并且 Vim(使用 Pyright)可以完美识别它。即使在 pycharm 上运行它,实际上也可以处理所有导入错误。
3. 现在该怎么办?
直到他们修复它或者我找到解决方案,我才会手动将 src 文件夹添加到解释器设置中的路径中,因为我不想安装它(但我希望能够达到峰值并转到定义)。
如果我真的想安装该包,我会在终端或 pycharm 中使用python -m pip install -e -v .
解决方案 2:
所述问题是由于必须在 PyCharm 终端内激活 venv而导致的。
以下是您可能遇到的情况的描述。(问题并不是立即显现出来的,因为与终端不同,调试、运行等功能以无缝方式集成了 venv。)
需要注意的是:
在开发模式
-v
下安装时使用详细标志可以提供有关pip和setuptools正在尝试执行的操作的线索。决定性的pip消息基于您的写权限
site-packages
,但是如果在终端上激活您的 venv,您将不必更改任何默认权限。如果您使用 1 venv,则将会
site-packages
涉及 3 种不同的路径(注意路径)。
您可能会尝试以下 3 个选项:
选项 1.以管理员身份运行PyCharm,从终端执行以下操作:
C:MyProject>pip install -v -e .
Non-user install because site-packages writeable
(...)
Creating c:program filespython38libsite-packagesmylibrary.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
ameappdata
oamingpythonpython38site-packagesmylibrary.egg-link (link to src)
这会安装到site-packages
(注意路径)venv 之外,以及 Python 基础安装之外。您可能想避免这种情况,因为完成后PyCharm将无法识别开发安装。
注意:终端中的消息“(...) site-packages 不可写”指的是site-packages
Python 基础安装中的。但是,如果不明确激活 venv,即使您将权限设置为可写,开发安装也不会写入您的 venv site-packages
。
选项 3.以用户身份运行PyCharm。在终端上激活 venv。
(MyProject_venv) C:MyProject>pip install -v -e .
Non-user install because user site-packages disabled
(...)
Creating c:myproject_venvlibsite-packagesmylibrary.egg-link (link to src)
在这里您确实site-packages
在 venv 中写入了内容,这可能就是您想要的。