iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python模块引入问题如何解决
  • 944
分享到

python模块引入问题如何解决

2023-07-05 11:07:48 944人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python模块引入问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python模块引入问题如何解决”文章能帮助大家解决问题。1.PyCharm运行python脚本的过程

这篇文章主要介绍“python模块引入问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python模块引入问题如何解决”文章能帮助大家解决问题。

1.PyCharm运行python脚本的过程

使用pycharm等编辑器run/debug运行python脚本时,编辑器会通过本地python命令全路径执行脚本,例如

D:\DevelopTools\Python\python.exe D:/Codes/一长串路径/bbss_nature_python/demo/test_no_param_in.py

并且会在python系统环境命令路径prepend即append first拼接启动脚本的绝对目录路径和脚本依赖的绝对目录路径,例如

print ("sys.path")['D:\\Codes\\一长串路径\\bbss_nature_python\\demo', 'D:\\Codes\\一长串路径\\bbss_nature_python', ...]

这是由于pycharm编辑器run/debug配置中自动定义了全路径工作目录、全路径启动脚本、环境命令拼接等,如下图

python模块引入问题如何解决

2.python命令运行python脚本常见模块引入问题

例1

D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust>python bbss_nature_python/demo/test_no_param_in.py

在以上工作目录,使用相对路径运行python脚本,报错如下(绝对路径也是同样的报错)

Traceback (most recent call last):
   File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 17, in <module>
    from common_code import ScriptReturnClz, _object2JSON_str
ModuleNotFoundError: No module named 'common_code'

例2

D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust>python bbss_nature_python/demo/test_no_param_in.py

在以上工作目录,使用相对路径运行python脚本,报错如下(绝对路径也是同样的报错)

Traceback (most recent call last):
   File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 18, in <module>
    from ..common_code import ScriptReturnClz, _object2json_str
ImportError: attempted relative import with no known parent package

3.python命令运行python脚本模块引入问题的解决方案

Python在引用库文件时,会自动从python安装目录的Lib子目录等目录查找依赖,默认查找路径可以通过命令print(sys.path)查看

print ("sys.path") ['D:\\Codes\\cust\\rycust\\bbss_nature_cust_2021-2030\\bbss_nature_cust\\bbss_nature_python\\demo', 'D:\\DevelopTools\\Python\\python310.zip', 'D:\\DevelopTools\\Python\\DLLs', 'D:\\DevelopTools\\Python\\lib', 'D:\\DevelopTools\\Python', 'D:\\DevelopTools\\Python\\lib\\site-packages']

可以看到,python命令执行一个python脚本前,会在sys.path数组第一位拼接启动脚本的目录绝对路径

测试用例目录文件树形图如下

python模块引入问题如何解决

3.1模块和当前脚本在同一目录下

在引用自定义模块时,如果模块和当前脚本在同一目录下,引入的时候,有以下几种方式:

直接模块名引入&radic;【不建议】

from test_with_param_in import _print_json_param

此时,pycharm编辑器会告警,但python、pycharm运行都是正常的

可以选择忽略告警(告警右键选择ignore)

包名.模块名引入&radic;【推荐,参见后文最佳方案】

from demo.test_with_param_in import _print_json_param

此时,pycharm编辑器不会告警,但python运行会报错

Traceback (most recent call last):

  File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 16, in <module>

    from demo.test_with_param_in import _print_json_param

ModuleNotFoundError: No module named 'demo'

此时需要引入缺少的模块所在的目录的绝对路径,如下

current_script_dir = os.path.split(os.path.realpath(__file__))[0]current_script_dir_parent = os.path.split(current_script_dir)[0]sys.path.insert(0, current_script_dir_parent)

.模块名引入&times;【不可行】

from .test_with_param_in import _print_json_param

此时,pycharm编辑器不会告警,但python运行会报错

Traceback (most recent call last):

  File "D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust\bbss_nature_python\demo\test_no_param_in.py", line 16, in <module>

    from .test_with_param_in import _print_json_param

ImportError: attempted relative import with no known parent package

无解决方案

3.2模块和当前脚本在不同目录下

如果模块和当前脚本不在同一目录下,必须指定模块路径,可以在当前脚本中import sys然后

通过sys.path.append(&lsquo;待引入的模块路径&rsquo;)或者sys.path.insert(0,&lsquo;待引入的模块路径&rsquo;)拼接的方式加入python系统命令路径,建议insert

待引入的模块路径,应该使用绝对(abs)路径,对于相对路径,python会直接拼接工作目录+相对路径生成绝对路径,拼接后的绝对路径是错误的(除非工作目录本身就是启动脚本的目录)

脚本内容:

# 当前脚本abs目录current_script_dir = os.path.split(os.path.realpath(__file__))[0]# 当前脚本目录的上级abs目录(对于本测试用例即为待引入模块的abs目录)current_script_dir_parent = os.path.split(current_script_dir)[0]# 待引入模块common_code的abs目录加入系统环境命令路径数组 sys.path.insert(0, current_script_dir_parent)print("print (\"sys.path\")")print(sys.path) # 引入自定义模块common_code【注意,代码中必须先添加路径之后才能引入】 from common_code import ScriptReturnClz, _object2json_str

命令:

D:\Codes\cust\rycust\bbss_nature_cust_2021-2030\bbss_nature_cust>python bbss_nature_python/demo/test_no_param_in.py

运行结果:

print ("sys.path")
 
['D:\\Codes\\cust\\rycust\\bbss_nature_cust_2021-2030\\bbss_nature_cust\\bbss_nature_python', 'D:\\Codes\\cust\\rycust\\bbss_nature_cust_2021-2030\\bbss_nature_cust\\bbss_nature_python\\demo', 'D:\\DevelopTools\\Python\\python310.zi
p', 'D:\\DevelopTools\\Python\\DLLs', 'D:\\DevelopTools\\Python\\lib', 'D:\\DevelopTools\\Python', 'D:\\DevelopTools\\Python\\lib\\site-packages']

4.python命令运行python脚本模块引入的最佳方案

4.1复杂工程的依赖遍历问题

当待引入的模块和当前脚本在不同目录下时,需要在环境变量中加入待引入模块目录的绝对路径,每个类似的启动脚本(即python命令执行的脚本)都需要编写很多类似的模板代码,而且由于依赖的传递性,可能无法简单地遍历出所有的自定义依赖模块

4.2 IDE的依赖默认引入方式

复杂依赖的python脚本,尤其是系统级规模化的python工程,通常使用pycharm等IDE编写。IDE会创建python工程,并且以工程目录为工作目录,在编写py脚本时,从工作目录开始查找自定义模块,自动补齐工作目录下的相对路径。另外,在打包python工程时,也是从工程目录开始。因此,使用IDE的默认的补全模块路径的依赖引入方式是最优选择

4.3多工程依赖的解决方案

不同于java微服务子工程之间的依赖引用,python没有子工程概念,只有一个完整的未拆分的工程。如果两个工程之间有模块依赖关系,则需要同时部署两个工程,并使用绝对路径引入另一个工程的工程目录,然后从工程目录开始引入所需模块。对于常用的自定义的基础依赖,也可以打包发布到公有源或私有源,直接install引入模块。从工程角度考虑,需要区分模块的命名空间,应采用和java包名类似的方式,以组织或个人的标识创建模块总包

4.4找到python工程的工程目录【方案本案】

鉴于IDE的依赖引入方式,只要将python工程的工程目录加入sys.path,则工程内的任何一个pycharm可成功运行的启动脚本都可以用python命令成功运行

怎样可以方便地找到一个python工程的工程目录?这取决于一个工程有多少启动脚本,以及每个启动脚本的位置

如果一个python工程只有一个启动脚本,比如一个python文件服务器,那么这个脚本应该直接放在工程一级目录下(如下图中工程目录为D:\tmp\python,start.py为启动脚本),这样可以顺利找到当前工程中的所有自定义依赖,这是因为启动脚本路径自动拼接环境变量

python模块引入问题如何解决

如果一个python工程有多个启动脚本,并且不是都在工程目录下,比如一个python计算工具包,那么每一个启动脚本的全局代码块都需要添加工程目录,举例如下

# 当前脚本abs目录current_script_dir = os.path.split(os.path.realpath(__file__))[0]# 当前脚本目录的上级abs目录(对于本测试用例即为python工程abs目录,如果不是,可继续上溯)current_script_dir_parent = os.path.split(current_script_dir)[0]# python工程路径python_project_dir = current_script_dir_parentif sys.path[0] != python_project_dir:    sys.path.insert(0, python_project_dir)    print("添加工程目录:" + python_project_dir)    print("print (\"sys.path\")")    print(sys.path)

关于“python模块引入问题如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网Python频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: python模块引入问题如何解决

本文链接: https://www.lsjlt.com/news/351158.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python模块引入问题如何解决
    这篇文章主要介绍“python模块引入问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python模块引入问题如何解决”文章能帮助大家解决问题。1.pycharm运行python脚本的过程...
    99+
    2023-07-05
  • python模块引入问题和解决方案
    目录1.pycharm运行python脚本的过程2.python命令运行python脚本常见模块引入问题3.python命令运行python脚本模块引入问题的解决方案3.1模块和当前...
    99+
    2023-03-09
    python模块引入
  • 如何解决SpringBoot引用别的模块无法注入的问题
    小编给大家分享一下如何解决SpringBoot引用别的模块无法注入的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!引用别的模块无法注入的问题前段时间尝试着利用...
    99+
    2023-06-29
  • 解决SpringBoot引用别的模块无法注入的问题
    目录引用别的模块无法注入的问题问题描述解决方法多模块项目中无法注入其他模块的springbean引用别的模块无法注入的问题 前段时间尝试着利用空闲时间搭建了一个IIM消息通信系统,目...
    99+
    2022-11-13
  • 关于rust的模块引入问题
    目录Rust语言的特点Rust的应用worker.rs文件,简单看一下student.rs看一下teacher.rs看一下第一部分是一个绝对路径的引入第二部分是相对路径的引入第三部分...
    99+
    2022-11-13
  • 如何解决Systemjs模块化问题
    这篇文章主要介绍“如何解决Systemjs模块化问题”,在日常操作中,相信很多人在如何解决Systemjs模块化问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决Sy...
    99+
    2022-10-19
  • Python导包模块报错的问题解决
    Python导包模块报错的问题: import报错No module named "xxx"的问题如何将指定目录作为项目根目录,让项目根目录下的包/模块都可以直接...
    99+
    2022-11-13
  • python无法导入模块如何解决
    要解决Python无法导入模块的问题,可以尝试以下几种方法:1. 检查模块是否已经正确安装: 使用pip或conda等包管理工具重新...
    99+
    2023-10-19
    python
  • python模块循环引用导致问题
    这个问题遇到几次了,代码写多了之后,莫名其妙报错。现在终于知道了是因为循环引用的问题。重现一下: # 文件名:module1.py from module2 import run def test(): pass if __nam...
    99+
    2023-01-31
    模块 python
  • 如何解决IDEA包转模块的问题
    这篇文章给大家分享的是有关如何解决IDEA包转模块的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在IDEA拉取代码,但是拉取下来之后,发现之前创建的模块变成包类型的了(直接模块也可能造成的这个问题,同样可以...
    99+
    2023-06-15
  • Python import模块的缓存问题解决方案
    在使用django开发的平台中,支持用户自定义函数,但是每次用户进行修改编辑后,该模块内容已更改,然后重新导入该模块,但是Python 会认为“我已经导入了该模块,不需要再次读取该文...
    99+
    2022-11-12
  • Python多模块引用由此引发的相对路径混乱问题怎么解决
    这篇文章主要介绍“Python多模块引用由此引发的相对路径混乱问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python多模块引用由此引发的相对路径混乱问题怎么解决”文章能帮助大家解决问...
    99+
    2023-07-05
  • 如何解决PHP找不到模块的问题
    在进行PHP语言开发过程中,经常会遇到"找不到模块"的错误提示,这是由于PHP配置文件中没有引用正确的扩展模块所导致的。PHP虽然是一门开放源代码的脚本语言,但在很多方面都需要进行配置,以便让代码正常运行。接下来,我们就...
    99+
    2023-05-14
  • Python如何引入同级包和模块
    目录如何引入同级包和模块工程项目结构如下首先是Gound.py引入Animal模块Sky和Sea同理测试结果如何导入同级.py文件导入.py文件的所有方法如何引入同级包和模块 工程项...
    99+
    2022-11-13
  • golang中包无法引入问题如何解决
    这篇文章主要讲解了“golang中包无法引入问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang中包无法引入问题如何解决”吧!问题背景开发环境区分不同网段,同一个程序引入到...
    99+
    2023-07-05
  • 如何解决安装Python后IDA中找不到Python模块的问题
    这篇文章主要介绍如何解决安装Python后IDA中找不到Python模块的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!        IDA...
    99+
    2023-06-25
  • python模块:Scipy.optimize.minimize规划问题求解
    目录 一、模块介绍 二、模块源分析与参数解释 三、实例求解 四、参考 一、模块介绍 1.1模块功能         Scipy.optimize是Scipy中一个用于解决数学模型中优化类模型的子包,该子包中又包含了多个子功能模块见下表,...
    99+
    2023-10-06
    python scipy numpy 线性代数 矩阵
  • Python 模板引擎的注入问题分析
    这几年比较火的一个漏洞就是jinjia2之类的模板引擎的注入,通过注入模板引擎的一些特定的指令格式,比如 {{1+1}} 而返回了 2 得知漏洞存在。实际类似的问题在Python原生字符串中就存在,尤其是P...
    99+
    2022-06-04
    模板 引擎 Python
  • python安装cx_Oracle模块常见问题与解决方法
    本文实例讲述了python安装cx_Oracle模块常见问题与解决方法。分享给大家供大家参考,具体如下: 安装或使用cx_Oracle时,需要用到Oracel的链接库,如libclntsh.so.10.1,...
    99+
    2022-06-04
    常见问题 解决方法 模块
  • Python中import导入上一级目录模块及循环import问题的解决
    import上一级目录的模块 python中,import module会去sys.path搜索,sys.path是个列表,并且我们可以动态修改。 要import某个目录的module,我们sys.path...
    99+
    2022-06-04
    模块 目录 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作