Python项目管理: Poetry

1. 导读

本文将介绍一个目前十分流行,且用于众多Python项目中依赖管理打包的工具,包含基本的安装与使用。

2. Poetry

Poetry 是Python 中用于依赖管理打包的工具。它允许您声明项目所依赖的库,并将为您管理(安装/更新)它们。Poetry 提供了一个锁定文件以确保可重复安装,并且可以构建您的项目以进行分发。

2.1. *toml文件

pyproject.toml可以算是Poetry的核心配置文件了,里面包含了项目的相关信息,使用的环境信息,安装的依赖信息,主要有一下配置:

 # 项目包的名字
name = "my-package" 

# 版本
version = "0.1.0"

# 包的描述
description = "A short description of the package."

# 许可证
license = "MIT"

# 作者
authors = ["冷冻工厂 <storyice@163.com>",]

# 维护者
maintainers = ["冷冻工厂 <storyice@163.com>",]

# READMD文件
readme = ["docs/README1.md", "docs/README2.md"]

# 包的介绍主页
homepage = "https://python-poetry.org/"

# 仓库地址
repository = "https://github.com/python-poetry/poetry"

# 文档
documentation = "https://python-poetry.org/docs/"

3. 实战

3.1. 安装

在Linux、macOS、Windows (WSL)中安装Poetry

  • Linux、macOS、Windows (WSL)
curl -sSL https://install.python-poetry.org | python3 -
  • 升级现有Poetry
poetry self update

3.2. 新建项目

  • 创建新的项目
poetry new project-name

# 项目名 与 文件夹名 不同
poetry new folder-name --name project-name

# 使用src项目结构(可选)
poetry new --src project-name

# 初始化已经存在的项目
cd project-name-dir
poetry init

3.3. 环境管理

poetry首先会检查当前项目是否存在虚拟环境,如果存在,保持现有环境,如果没有,会自动创建一个与当前依赖相匹配的环境。

  • 选择项目环境
poetry env use /full/path/to/python

# 如果解释器已经添加到环境变量中
poetry env use python3.7
poetry env use 3.7  # 同上,二选一
  • 显示当前环境信息
poetry env info

  • 显示与当前项目相关的环境
poetry env list

  • 删除环境
poetry env remove /full/path/to/python

# 同时删除多个环境
poetry env remove python3.6 python3.7 python3.8

# 一次性删除全部环境 
poetry env remove --all

小编建议设置下面配置,其作用是将虚拟环境的文件夹放置于项目文件夹下

poetry config virtualenvs.in-project true

3.4. 依赖管理

使用Poetry进行添加依赖,有两种方式。一种是在命令行中,直接使用相关命令来添加依赖,或者删除依赖。另外一种是,通过修改项目中的pyproject.toml文件,来管理依赖。

  1. 命令行管理
# 添加依赖
poetry add <lib>

# 添加dev依赖
poetry add <lib> --dev  # poetry add package-name -D

# 删除依赖
poetry remove <lib>

# 更新依赖
poetry update

# 锁定依赖版本
poetry lock

# 列出全部依赖项
poetry show

# 列出陈旧的依赖项
poetry show --outdated

# 搜索指定的包
poetry search <name>
  1. 配置文件管理
[tool.poetry]
name = "project-name"
version = "0.1.0"
description = ""
authors = ["Swindler <jzj@1033199817@qq.com>"]
readme = "README.md"
packages = [{include = "project_name"}]

[tool.poetry.dependencies]
python = "^3.8"
# 在此直接添加,如 0.1.0 版本的numpy
numpy = "0.1.0"

# 如果不知道指定的版本,可以用*代替,Poetry会自动选择合适的版本
numpy = "*"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

根据配置文件更新依赖

poetry update

依赖的版本指定,支持不等式(简单易用)

>= 1.2.0
> 1
< 2
!= 1.2.3

3.5. 换源

Poetry也支持换源,加速依赖的下载速度.

  • 清华源
# 将下方配置添加至pyproject.toml末尾即可
[[tool.poetry.source]]
name = "tsinghua-source"
url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
default = true  # 仅从定义仓库获取
  • 阿里源
# 将下方配置添加至pyproject.toml末尾即可
[[tool.poetry.source]]
name = "aliyun-source"
url = " http://mirrors.aliyun.com/pypi/simple/"
default = true  # 仅从定义仓库获取

3.6. requirement

Poetry也支持requirement.txt操作

  • 导出requirement.txt
poetry export -f requirements.txt --output requirements-prod.txt --without-hashes
  • 导入requirement.txt
cat requirements.txt|xargs poetry add
本文转载于网络 如有侵权请联系删除

相关文章

  • Flask 轻量web框架

    【前置条件:你已经在windows下搭建好了Pycharm集成开发工具+python3.6的版本及相关的第三方包】Step1:直接上框架全图Step2:框架的结构说明项目结构-manage.py用来控制程序的 pythonmanage.pyrunserver#启动服务命令 pythonmanage.pyshell#进入shell脚本模式命令 -app/__init__初始化文件 初始化整个Flask对象,以及Flask所用的各种插件,并返回一个app应用 -app/settings项目配置文件 配置整个项目运行环境 -app/ext项目的扩展库 第三方扩展库打包处理 -app/views视图函数 处理业务逻辑 协调模块和模型之间的关系 -app/models模型 定义模型结构 获得数据库中的表的关系映射 db.create_all()创建数据库 db.drop_all()删除数据库 -doc框架说明文档 -static用于存放静态资源的目录 -templates用于存放模板资源的目录 -migrations迁移目录 数据迁移 -将模型映射到数据库 -使用flask-m

  • python测试开发django -140.Bootstrap 缩略图

    前言网格中布局图像、视频、文本等。Bootstrap通过缩略图为此提供了一种简便的方式。使用Bootstrap创建缩略图的步骤如下: 在图像周围添加带有class.thumbnail的<a>标签。 这会添加四个像素的内边距(padding)和一个灰色的边框。 当鼠标悬停在图像上时,会动画显示出图像的轮廓。缩略图a标签加class属性.thumbnail<divclass="container"> <divclass="row"> <divclass="col-xs-6col-sm-3col-md-3"> <ahref="#"class="thumbnail"> <imgsrc="/static/images/yoyo.png"> </a> </div> <divclass="col-xs-6col-sm-3col-md-3"> <ah

  • jQuery 过滤选择器

    名称用法描述:eq(index)$(“li:eq(2)”).css(“color”,”red”);获取到的li元素中,选择索引号为2的元素,索引号index从0开始。:odd$(“li:odd”).css(“color”,”red”);获取到的li元素中,选择索引号为奇数的元素:even$(“li:even”).css(“color”,”red”);获取到的li元素中,选择索引号为偶数的元素案例:<!DOCTYPEhtml> <htmllang="zh-CN"> <head> <metacharset="UTF-8"> <title>Title</title> </head> <body> <ul> <li>我是第1个li</li> <li>我是第2个li</li> <li>我是第3个li</li> <li>我是第4个li</li> <li

  • 操作系统篇-进程管理和中断

    以下针对java来说明1.进程线程纤程进程和线程区别进程就是一个程序运行起来的状态,线程是一个进程中的不同的执行路径。 进程是OS分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间)线程在Linux中的实现《Linux内核设计与实现》第三版28页 线程在Linux就是一个普通的进程,只不过和其他进程共享资源(内存空间,全局数据等)其他系统都有各自所谓的LWP的实现LightWeightProcess(轻量级进程)纤程 即:用户空间的线程为什么需要纤程: java启动线程,在操作系统级别,就是启一个LWP。这是重量级线程。因为java启动线程需要向操作系统申请资源,和操作系统内核打交道,需要系统调用。 而纤程是线程中的线程,对应图最上面蓝色框,在用户空间,不需要向操作系统申请。 纤程处于线程内部,非常轻量级,可以在线程中快速切换。JVM自己管理,自己实现调度,自己切换,与操作系统无关。纤程优势:占有资源很少OS:线程:1MvsFiber:4K切换比较简单启动很多个10W+纤程的应用场景: 很短的计

  • Android 列表倒计时的实现的示例代码(CountDownTimer)

    实习一段时间了,一直想写点技术总结,但一直没找到合适的主题。刚好,最近版本中我负责的模块遇到了个线程相关问题(之前一直画界面,做点基础功能,有点乏味),列表项倒计时的实现。于是乎,我的第一篇android技术文章就诞生了。【醒目】该demo用Kotlin语言实现。背景介绍需要在ListView的item里实现倒计时,初看还挺简单的,但是真正做的时候也遇到了不少坑。 网上有不少类似文章,有用对TextView扩展实现的,也有用自带的CountDownTimer实现的,本文就是用CountDownTimer,只不过多了对服务器时间的刷新控制,更贴近项目需求吧。刚学了点kotlin,就拿这个来练练手。所以这个demo的源码就用koltin实现了,想了解学习kotlin的也可以来交流下,刚学,代码里可能有些细节语法用的不好。要点分析:倒计时需要根据请求所得服务器时间和结束时间确定(所以要一个线程来维持服务器时间的运行,而且还有n个线程来维持item项的倒计时刷新显示)。既然是多线程,那么线程的控制就要注意了解CountDownTimer在看代码前,先来了解下android自带的CountDow

  • 计算机网络物理层习题

    本文不对习题做任何解释,均为最基础的知识,如有疑惑其移步计算机网络物理层知识梳理学习相关内容。更多内容请关注专栏计算机网络。 1、两台计算机利用电话线路传输数据信号时必备的设备是调制解调器。2、数字数据在模拟信道上传递需要进行调制编码。3、调制解调器的作用是把计算机信号和模拟信号相互装换。4、奈奎斯特定理描述了有限带宽、无噪声信道的最大数据传输速率与信道带宽的关系。对于一进制数据,若信道带宽B=3000Hz,则最大数据传输速率为6000b/s。5、香农定理描述了信道的最大传输速率与哪些(个)参数之间的关系:信道带宽和噪声功率。6、收音机的信号传输属于:单工通信。7、若某通信链路的数据传输速率为2400bps,采用4相位调制,则该链路的比特率是1200比特。8、在物理层接口特性中,用于描述完成每种功能的事件发生顺序的是过程特性。9、不会影响信道数据传输速率的是信号传输速度。10、在下列多路复用技术中,适合于光纤通信的是WDMA。11、在数据通信中,利用电话交换网与调制解调器进行数据传输的方法属于频带传输。12、若信道的复用是以信息在一帧中的时间位置(时隙)来区分,不需要另外的信息头来标志

  • php API设计实现

    如何设计错误码?如果做版本控制?版本信息写进请求头url路由框架选用?api路由解决出现post请求报错问题默认走的是web.php路由,而web.php在laravel中是有csrf保护的,为了防止伪造跨站请求csrf,post请求必须带上token,具体操作见文档的csrf章节解决办法参考https://blog.csdn.net/lgyaxx/article/details/71250086当然也可以打开文件:app\Http\Kernel.php 把这行注释掉: https://www.cnblogs.com/HD/p/4555369.html 'App\Http\Middleware\VerifyCsrfToken'状态码含义1字头消息2字头成功3字头重定向4字头客户端原因引起的错误5字头服务器端引起的错误jwt(jsonwebtoken)

  • 10、使用Java High Level REST Client操作elasticsearch

    阅读文本大概需要15分钟。Elasticsearch删除和更新也都是写操作。但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更。那么该如何删除和更新文档呢?磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。接下来我们看更新是如何工作的。在新的文档被创建时,Elasticsearch会为该文档指定一个版本号。当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。物理删除索引:当索引数据不断增长时,对应的segment也会不断的增多,查询性能可能就会下降。因此Elasticsearch会触发segment合并的线程,把很多小的segment合并成更大的segment,然后删除小的segment,当这些标记为删除的segment不会被复制到新的索引段中。1、删除索引Index同步删除publicstat

  • 全球4亿条用户电话号码曝光 Facebook再曝巨大安全漏洞

    9月5日据外媒消息报道,社交大佬平台Facebook存在严重的安全漏洞,一个存储了数以亿条与Facebook帐户关联的电话号码数据库在网上泄露,每条记录都包含一个用户的FacebookID和连接到他们账户的电话号码,全球超4亿用户隐私面临风险。暴露的服务器包含多个数据库中的记录,涉及不同地理位置的用户,其中包括美国Facebook用户的1.33亿条记录,英国1800万条用户记录,以及超过5000万条越南用户记录等。由于服务器没有密码保护,任何人都可以找到并访问这些数据库。媒体已经对其中一些记录进行验证,此外还发现部分记录包含用户的姓名、性别和国家/地区的位置。Facebook安全问题频发生?Facebook安全隐患在8月就有发生过,只是当时没多少人关注。据外媒报道,以色列网络安全公司CheckPoint在8月8号称,在Facebook旗下流行的消息应用WhatsApp中发现严重安全漏洞,允许黑客操控用户的聊天消息,无论是在公共对话模式下,还是私密对话。对此,Facebook一名发言人在一份电子邮件声明中表示:“我们在一年前仔细审查了这个问题,认为我们在WhatsApp上提供的安全存在漏

  • Windows Server 2012 RC活动目录与证书服务安装

    本次体验发现,在WindowsServer2012RC中,活动目录的安装和以前发生了很大的变化,已经不能够在使用DCPROMO来进行活动目录安装了。下面来看看活动目录和证书服务的安装方法。1.运行DCPROMO来进行活动目录安装,发现不能够进行,需要从服务器管理器来安装。2.打开服务器管理器,快速启动那里添加角色和功能。3.选择服务器角色,ActiveDirectory域服务,下一步。4.选择功能,默认,下一步。5.安装ADDS的注意事项,直接下一步。6.确认,进行安装。7.很快,完成ADDS的角色添加。但是并没有结束,还需要进行角色的配置。8.回到服务器管理,仪表板,点开上方的小旗帜,在部署后配置那里将次服务器提升为域控制器。9.选择添加新林,输入根域名contoso.local。10.选择林、域功能级别,添加DNS服务器,下一步。11.设置NetBIOS域名,默认情况不用修改,下一步。12.完成先决条件检查后,进行AD的安装。13.完成安装后,进入ADUC界面,和2008没多大变化。14.继续进行ActiveDirectory证书服务的安装,在添加角色和功能进行添加。15.与之前添

  • 企业的云迁移指南

    如今的企业比以往任何时候都能访问更多的数据。这些数据正在以惊人的速度增长,无论是数量还是变化量。无论是传统的分析还是机器学习和人工智能等前沿技术,将这些信息从所有信息源集中到云存储库对业务至关重要。为什么进行迁移?企业将数据迁移到云端就像人们搬到新家一样。企业需要知道自己为什么要迁移,需要迁移什么,以及计划迁移的去向。企业希望从云端获得什么?当前的设置是否已超出上限?如何更好地为企业的数据分析或机器学习堆栈提供动力?企业如何利用云端提供的所有功能?是否能够利用其架构优势?其可扩展性和弹性是什么?其安全性如何?是否节约成本?将会带来什么?是一切吗?如果对此进行一次详细调查,人们可能会对来自这么多来源的数据感到惊讶。当然,这样复杂的举动并不是企业一时兴起的行为。相反,它需要重要的计划和正确的工具集才能取得成功。在企业构建迁移清单之前,首先考虑一些常见的注意事项:1.安全性在数据隐私正成为一个良好数据管理实践的世界中,了解哪些数据是可共享的,哪些数据是不可共享的,这一点很重要。个人用户需要确保其PII(个人身份信息)数据不会暴露给错误的各方是至关重要的。因此,重要的是要全面检查整个管道和数据

  • 使用 Octave 来学习 Machine Learning(一)

    阅读本篇大概需要5分钟。前言各位小伙伴如果是通过Coursera上吴恩达的机器学习视频来学习的话,一定听到过Octave的大名了,吴恩达强烈推荐大家使用Octave来学习机器学习,并且用了完整的一个章节「OctaveandMatlabTutorial」来讲述Octave的基本操作。非常实用,也很简单,推荐想使用Octave的同学去学习一下。 我在使用Octave的过程中,最舒服的地方就是它对矩阵操作的支持非常全面,使用起来也很简单,一些看似很复杂的逻辑,用Octave可能一两行就可以轻松解决。我将带大家认识和入门Octave。此文分两篇来讲解。什么是OctaveOctave是一种高层解释类编程语言。旨在解决线性和非线性的数值计算问题。Octave为GNU项目下的开源软件,Octave语法与Matlab语法非常接近,可以很容易的将Matlab程序移植到Octave。上面的说法不太通俗,简而言之,Octave是一些科学计算软件,对于一些矩阵啊,一些高级的工程运算方面的工作,它比较擅长,而另一个功能类似的软件就是大名鼎鼎的Matlab。那么我们为什么非要选择Octave而不选择更有名的Mat

  • 腾讯云数字身份管控平台(员工版)获取应用信息api接口

    1.接口描述接口请求域名:eiam.tencentcloudapi.com。 获取一个应用的信息。 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。本文档展示的是V1签名的参数说明,腾讯云建议您使用安全系数更高的V3签名算法,使用签名方法v3时,公共参数需要统一放到HTTPHeader请求头部中,详情。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeApplication。 Version 是 String 公共参数,本接口取值:2021-04-20。 Region 否 String 公共参数,本接口不需要传递此参数。 ApplicationId 否 String 应用id,是应用的全局唯一标识,与ClientId参数不能同时为空。 ClientId 否 S

  • 学习的前置课程单片机

    首先要掌握理论知识,第一步还是要通读一遍教材,这样我们才能站在巨人的肩膀上。《电工基础》、《电路分析》、《模拟电路》、《数字电路》、《电子制作》等电子技术基础知识一定要先通读。   (1)电场与磁场:库仑定律、高斯定理、环路定律、电磁感应定律。   (2)直流电路:电路基本元件、欧姆定律、基尔霍夫定律、叠加原理、戴维南定理。   (3)正弦交流电路:正弦量三要素、有效值、复阻抗、单相和三相电路计算、功率及功率因数、串联与并联谐振、安全用电常识。   (4)RC和RL电路暂态过程:三要素分析法。   (5)变压器与电动机:变压器的电压、电流和阻抗变换、三相异步电动机的使用、常用继电-接触器控制电路。   (6)半导体及二极管及整流、滤波、稳压电路。   (7)三极管及单管放大电路、信号处理电路、信号发生电路、功率放大电路、直流稳压电源等。   (8)电子产品工艺流程、电子产品的结构和装配、调试和检修。   (9)线性集成运算放大器和运算电路及理想运放组成的比例、加减和积分运算电路。   (10)数字基础及逻辑函数化简、集成逻辑门电路、组合逻辑电路和 RS、D、JK触发器,时序逻

  • Leetcode 344. 反转字符串

    简单 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。 你可以假设数组中的所有字符都是ASCII码表中的可打印字符。   示例1: 输入:["h","e","l","l","o"]输出:["o","l","l","e","h"] 示例2: 输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"] 思路:使用双指针从两边走到中间 publicvoidreverseString(char[]s){ intleft=0; intright=s.length-1; while(left<right){ chartmp=s[left]; s[left++]=s[right]; s[right--]=tmp; ​ } }复制

  • 高精度 重载运算符模板

    适用范围非负数就可以 注意n多n多的细节就可以啦 #include<stdio.h> #include<algorithm> #include<cstring> #include<iostream> #include<stack> usingnamespacestd; typedeflonglongll; constintN=4; constllbase=1e4; structHP { private: intlen;lla[200];//longlong一共占了8位字节,比int翻了一倍,所以数据量不需要太大 inlinevoidclear(){ while(!a[len]&&len>1)len--; } public://public下面是冒号 voidprint()//print是内部函数,所以不需要引用 { printf("%lld",a[len]); for(inti=len-1;i>0;i--)//len已经输出,所以是len-1 for(intj=base/10;j>0

  • LOJ3193 「ROI 2019 Day2」机器人高尔夫球赛

    Link 首先有一个比较显然的\(O(nm)\)的dp。 同时我们可以发现,对于一个洞,它只能影响到离他Manhattan距离不大于\(2\)的位置。 剩下的点就只能够从它左下方的点转移过来。 按对角线顺序dp,用map维护被洞影响到的点特殊转移即可。 #include<cctype> #include<cstdio> #include<vector> #include<utility> #include<algorithm> #include<unordered_map> usingi64=longlong; usingpi=std::pair<int,int>; constintP=998244353; charibuf[1<<22],*iS=ibuf; intans;std::vector<pi>vec;std::unordered_map<i64,int>val;std::unordered_map<int,int>f,g; intread(){i

  • QRowTable表格控件(二)-红涨绿跌

    目录一、开心一刻二、概述三、效果展示四、任务需求五、指定列排序六、排序七、列对其方式八、相关文章 原文链接:QRowTable表格控件(二)-红涨绿跌 一、开心一刻 一天,五娃和六娃去跟蛇精决斗,决斗前有这样一段对话。 五娃:“妖精!今天我俩就要消灭你!今天就是你的死期!” 蛇精:“呵呵呵,真是可笑。你们自己个儿都是从树上长出来的,凭什么叫我妖精?!” 五娃:“你也说了,我们是从树上长出来的,是葫芦变的,自然不是妖精。” 蛇精:“你们不是妖精,难道还是神仙了,再难不成你把自己当人了?” 五娃和六娃异口同声道:“哈哈哈哈哈哈!你说对了,我就是人,是植!物!人!” 二、概述 最近工作比较忙,不过还是抽时间把这个表格组件继续完善下去。 Qt的自带的表格控件非常强大,支持各种方便操作,上一篇文章QRowTable表格控件-支持hover整行、checked整行、指定列排序等介绍了一个简单的demo,主要是做一个股票表格控件,而他天然的就是支持hover和checked行特性,对Qt比较熟悉的同学可能都知道Qt其实有两个接口,可以设置交互行为为选择行。 接口就是这两个

  • 程序异常退出调试

    这周遇到一个非常奇怪的事,程序在压力测试的时候会莫名奇怪的挂掉,但是调试时却发现情况也是很诡异。使用GDB打印调用栈后发现,函数调用栈里的this指针指向的值不对劲。 CRedisClient::connect(this=0x603, ip=<errorreadingvariable:Cannotaccessmemoryataddress0x1>,port=4, timeout=-1956863078) 复制 不仅如此,所有参数的值都不对。当时就在想,是不是某个地方的操作导致内存溢出了,覆盖了栈内容,于是就想顺着调用栈一直往上找,看看是在哪个函数调用处出的问题,然而却发现找到第一个调用栈时,this指针和函数参数还是不对,更加让人不解的是,所有的调用栈里,使用infolocals查看变到的局部变量的值都是正确的,这就表明,程序堆栈并没有完全被破坏掉。而且,某些局部变量的值是从函数参数里算出来的,但是infoargs查看参数就有问题,infolocals查看局部变量就有问题。通过查找资料,大概明白了可能原因,由于现在的CPU都拥有数量较多的寄存器,于是,一般的参数传递都是

  • POJ 2406 Power Strings (求字符串循环节出现的次数)

    PowerStrings TimeLimit: 3000MS   MemoryLimit: 65536K TotalSubmissions: 44217   Accepted: 18449 Description Giventwostringsaandbwedefinea*btobetheirconcatenation.Forexample,ifa="abc"andb="def"thena*b="abcdef".Ifwethinkofconcatenationasmultiplication,exponentiationbyanon-negativeintegerisdefinedinthenormalway:a^0=""(theemptystring)anda^(n+1)=a*(a^n). Input Eachtestcaseisalineofinputrepresentings,astringofprintablecharacters.Thelengthofswillbeatleast1andwilln

  • 模块导入失败问题

    最近遇见一个Python模块导入自己踩到的坑,搞了好久才整明白,记录一下,也给在同样采坑的小伙伴借鉴一下。 错误现象很明显,相信大家遇到的报错都一样,但是就是不知道为什么,报错如下:    导入模块源码如下:    百思不得其解啊,各种百度和研读女神博客,感觉模块导入这块还是相对容易理解和接受的,为什么就是报错呢。 这里推荐一下女神写的很详细的一篇博客: https://www.cnblogs.com/Eva-J/articles/7292109.html 好了,进入正题吧,是什么原因导致报这个错呢,上面一行也是一样的方法导入,怎么就没报错。奇怪吧? 原因就是。。。 你导入的模块,也导入了你。不能相互导入!!! 就是server_common模块中已经导入了server_auth模块,你现在又在server_auth模块中再导入server_common,这个样子是不行滴。 那要怎么解决呢? 找到具体原因了,事情就好办了,把共用的方法提出来或者都写到一个模块里,然后只导入一个模块就好了。就是这么简单!! 另外,我有个习惯就是在pycharm里

相关推荐

推荐阅读