我想了解在导入中使用使用"src/布局“前缀的setuptools的正确方法是什么?
我已经阅读了大部分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
│当我使用发展模式 install 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是空的。
我用的是一个‘t,令我惊讶的是,鸡蛋符号链接不是写在venv sitepackages上,而是写到C:\Users\Name\AppData\Roaming\Python\Python38\site-packages.
Python表示找到了mylibrary包:
>>> from setuptools import find_packages
>>> find_packages(where='src')
['mylibrary']发布于 2020-06-22 04:21:22
这个问题描述了不得不使用激活PyCharm终端内的静脉的结果。
下面将描述您可能遇到的场景。(问题并不明显,因为与终端不同,调试、运行等功能以无缝的方式集成了venv。)
应当指出:
site-packages的写权限,但是如果在终端上激活venv,则不必更改任何默认权限。site-packages (注意路径)。您可能尝试的三个选项:
选项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)这将安装到基本Python安装中的site-packages (注意路径)。您可能希望避免的事情,因为它污染了您的基础安装。
选项2.以用户身份运行PyCharm。而不激活终端上的静脉。
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。激活终端上的静脉。
(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,这很可能是您想要的。
发布于 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 .在终端或内部安装
https://stackoverflow.com/questions/62498127
复制相似问题