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

2025-03-26 09:08:00
admin
原创
15
摘要:问题描述:我想了解什么才是正确的简约方式,即使用带有“src/layout”的setuptools ,以便src.在导入时无需使用前缀?我已经阅读了大部分PyPA和setuptools文档(及其许多用例),但我不明白什么才被认为是完成此示例的正确方法。下面的布局重现了我想要实现的目标。我不明白如何让第二个导入...

问题描述:

我想了解什么才是正确的简约方式,即使用带有“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下安装时使用详细标志可以提供有关pipsetuptools正在尝试执行的操作的线索。

  • 决定性的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-packagesPython 基础安装中的。但是,如果不明确激活 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 中写入了内容,这可能就是您想要的。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用