首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在导入中分配.src前缀的Src布局?激活PyCharm终端中的venv进行开发安装

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

Stack Overflow用户
提问于 2020-06-21 11:52:12
回答 2查看 1K关注 0票数 5

我想了解在导入中使用使用"src/布局“前缀的setuptools的正确方法是什么?

我已经阅读了大部分PyPAsetuptools工具文档(以及它的许多用例),但我无法理解如何使用正确的方法来处理这个示例。

下面的布局复制了我想要实现的目标。我不明白如何让第二个导入工作,而不是让第一个导入跨mylibrary包的所有模块:

代码语言:javascript
复制
from src.mylibrary.hello_word import hello_function # <- This works.
from mylibrary.hello_word import hello_function  # <- How to get this working?

hello_function()

使用此目录/文件结构:

代码语言:javascript
复制
C:\MyProject
│
│   setup.py
│
└───src
    │
    ├──mylibrary
    │      hello_word.py
    │      module_two.py
    │      __init__.py
    │

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

代码语言:javascript
复制
    │ (...)
    │ 
    └──mylibrary.egg-info
           dependency_links.txt
           PKG-INFO
           SOURCES.txt
           top_level.txt

用这个setup.py

代码语言:javascript
复制
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.

代码语言:javascript
复制
def hello_function():
    print("hello world")

__init__.py是空的。

我用的是一个‘t,令我惊讶的是,鸡蛋符号链接不是写在venv sitepackages上,而是写到C:\Users\Name\AppData\Roaming\Python\Python38\site-packages.

Python表示找到了mylibrary包:

代码语言:javascript
复制
>>> from setuptools import find_packages
>>> find_packages(where='src')
['mylibrary']
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-22 04:21:22

这个问题描述了不得不使用激活PyCharm终端内的静脉的结果。

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

应当指出:

  • 发展模式中安装时,使用详细的标志发展模式可以提示pip和setuptools想要做什么。
  • 决定性的pip消息基于site-packages的写权限,但是如果在终端上激活venv,则不必更改任何默认权限。
  • 如果您使用的是一个venv,将涉及3个不同的site-packages (注意路径)。

您可能尝试的三个选项:

选项1.运行PyCharm作为管理,从终端执行以下命令:

代码语言:javascript
复制
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)

这将安装到基本Python安装中的site-packages (注意路径)。您可能希望避免的事情,因为它污染了您的基础安装。

选项2.以用户身份运行PyCharm。而不激活终端上的静脉。

代码语言:javascript
复制
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在完成开发安装后不会识别它。

注意:终端“(.)站点-包不可写”中的消息指的是您的Python分期付款中的site-packages。但是,如果不显式地激活venv,即使您将权限设置为可写,开发分期付款也不会写入您的venv site-packages

选项3.以用户身份运行PyCharm。激活终端上的静脉。

代码语言:javascript
复制
(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)

在这里,您确实在venv中写信给site-packages,这很可能是您想要的。

票数 2
EN

Stack Overflow用户

发布于 2021-01-01 06:01:00

更新/解决办法

您可以按照此链接中的步骤将文件夹标记为source root。从链接中:

源根源根图标包含实际源文件和资源。PyCharm使用源根作为解析导入的起点。

这样,我们就不用再安装它或改变路径了(尽管我仍然觉得有点棘手)。

1. Pycharm有一个pip问题:

每当我在pycharm终端上运行pip时,它就会出于某种原因运行系统的pip。您可以使用which pip命令进行检查。但是如果我运行python -m pip,它会做正确的事情。

2.它应实际承认进口:

话虽如此,但我真的不明白,没有src.前缀,pycharm为什么不能识别这些导入。我从github克隆了‘加密包’,它通常会识别它,src文件夹会自动添加到path中,但我还不知道是怎么做到的。

无论哪种方式,您的代码在没有前缀的情况下按预期工作,Vim (使用Pyright)能够完美地识别它。即使在py魅力上运行它,实际上也可以处理所有导入错误。

3.现在怎么办?

在他们修复它或找到解决方案之前,我将手动将src文件夹添加到我的路径中解释器设置中,因为我不想安装它(但我希望能够达到峰值并进入定义)。

如果我真的想安装这个程序包,我会使用python -m pip install -e -v .在终端或内部安装

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62498127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档