python模块引入问题集锦与解析

1.入口文件不能用相对路径引入模块和包

所谓的入口文件,就是你需要执行的脚本文件。

文件架构如下:

---mother_dir

  ---from_test_dir
    ---tools_dir
           ---__init__.py
        ---demo.py
   
       ---__init__.py
       ---index.py

   ---__init__.py

上面_dir后缀的名字,都是python package模块名。

在如上的文件架构中假设index.py是入口文件,也就是我们需要执行的脚本,我们以index.py为起点,去引入demo.py代码如下:

from .tools_dir.demo import func
func()

再附上demo文件代码:

def func():
    print("hello")

报错信息如下:

Traceback (most recent call last):
  File "D:/lmj_work_file/lmj/from_dir/from_test/index.py", line 31, in <module>
    from .tool.xxx import func
ModuleNotFoundError: No module named ‘__main__.tool‘; ‘__main__‘ is not a package

纠错如下:

from tool.demo import func
func()

只需要把indexx.py文件中的相对引入换成绝对路径引入即可。

补充说明另外这里需要提示一点的是,如果是用pycharm这个ide写代码,那么,pycharm它本身默认的东西还是比较多的,提供了方便的同时,也提供了限制。比如这里模块引入的时候,如上的情况,我们纠错了,用pycharm可以运行,用命令行也能执行,但是在pycharm里面,

它会飘红提示,这里的原因,我稍微解释一下,pycharm默认,所有的入口文件都需要放到顶层路径下,所谓的顶层路径,就拿以上结构来说,最外层的文件夹名字是mother_dir它下面的一级路径就是顶层路径,也就是说我们把以上的项目结构改成如下的样子:

---mother_dir

   ---from_test_dir
    ---tools_dir
          ---__init__.py
       ---demo.py

    ---__init__.py

   ---__init__.py
   ---index.py

我们把index.py文件从from_test_dir包里面拿出来放到了monther_dir包里面,作为它的子文件,此时,我们的模块引入就不会在pycharm中有飘红提示了。

 

或者写成这样也可以:

from from_test.tool.xxx import func
func()

也不会飘红提示。

2,相对导入方法处理这里之所以会写这篇博客是因为我要把我写的脚本放到一个文件夹下面,便于管理,但是在这个过程中,有一些公共方法,我需要在脚本中互相引入,这些方法也跟脚本在同一个母文件路径下,此时的引入就出现问题。结构如下示例:

---mother_dir

   ---from_test_dir
     ---tools_dir
          ---__init__.py
       ---demo.py

     ---__init__.py
       ---index.py

    ---to_test_dir
       ---__init__.py
       ---test.py

    ---__init__.py
                     

还是把index作为入口文件,我们要从index.py中导入to_test_dir这个包里面的test.py文件中的内容。在index中的代码如下写:

from ..to_test.lala import test_functest_func()

报错信息如下:

ValueError: attempted relative import beyond top-level package

这里纠错,用绝对路径导入,把相对路径改成绝对路径。

from to_test.lala import test_func
test_func()

即可运行pycharm。

但是在命令行运行的时候,会抛错:

ModuleNotFoundError: No module named ‘to_test‘

当我们的ide和命令行的运行结构有歧义的时候,一定要解决命令行的问题,这也就是为什么很多大佬不用ide,只用vim编程的原因,快,还没有这么多衍生的问题。

我写这篇博客核心要解决的就是这个问题

import os
import sys
DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(DIR)
from to_test.lala import test_func
test_func()

把上面这段粘回去就能用了。命令行运行正常。

你想知道为什么吗?

我也不知道,自己去看源码吧,或者尝试print一些中间结果看看

原文地址:https://www.cnblogs.com/2012-dream/p/11647985.html

时间: 2024-11-09 01:40:21

python模块引入问题集锦与解析的相关文章

Python 模块引入,脚本执行

引入模块 创建一个fibo.py def fib(n): # write Fibonacci series up to n a, b = 0, 1 while b < n: print b a, b = b, a+b 引入这个文件,就可以使用了 >>> import fibo >>> fibo.fib(100) 1 1 2 3 5 8 13 21 34 55 89 或者 >>> from fibo import fib >>>

Python模块应用案例集锦

1.os模块1.1 Python os.walk的用法与举例 os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirnames, filenames), 第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件. dirpath 是一个string,代表目录的路径, dirnames 是一个list,包含了dirpath下所有子目录的名字. filenames 是

Python模块之: configobj(转)

原来也有写过一篇文章Python模块之: ConfigParser 用来解析INI文件,但是在使用过程中存在一些问题.比如:1,不能区分大小写.2,重新写入的ini文件不能保留原有INI文件的注释.3,重新写入的ini文件不能保持原有的顺序.4,不支持嵌套.5,不支持格式校验.我本来是想扩展ConfigParser来支持上面的一些缺点的,但是我觉得应该有人有类似的问题并应该有相关的模块满足我上面的需求的,于是放G搜索之.得到一个Lib: configobj.下面我将举例说明其常用的几个方法:项目

python 之模块引入

模块引入: 1.同级引入 如 ac_first.py 引入ac_second.py:只需直接 import ac_second 即可 这种情况 不论是 python ac\ac_first.py 还是 python ac_first.py 即使是 python ../ac_first.py 都不会报没有自定义模块的错误 2.下一层级引入 如 ac_second.py 引入 adc.py(hh/adc.py) (1)需要在hh文件夹下创建 __init__.py 文件,将hh变成python文件夹

Angular2.x/Typescript模块引入解析

首先,模块引入的时候有两种方式:1.相对导入: import Entry from "./components/Entry"; import { DefaultHeaders } from "../constants/http"; import "/mod"; 相对导入在解析时是相对于导入它的文件,并且不能解析为一个外部模块声明,你应该为你自己写的模块使用相对导入,这样能确保它们在运行时的相对位置. 2.非相对导入: import * as $

【Python中if __name__ == &#39;__main__&#39;: 的解析】

在很多Python代码中,在代码的最下方会看到  if __name__ == '__main__':,这段代码到底有什么用呢? 在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.py,其可以拿来执行,也可以用来作为模块使用import导入.当Python解析器读取一个源文件时它会执行所有的代码.在执行代码前会定义一些特殊的变量.如果解析器运行的模块(源文件)作为主程序,它将会把__name__变量设置成"__main__".如果只是引入其他的模块,__name__变

如何安装python模块

在python编程语言中,我们一般会用到python模块,如chardet.pygame,这些模块不包含在python的默认代码中,需要从外部下载并安装.有些模块提供了自动安装的文件,比如pygame的Windows版本,直接双击安装就可以.但大多数模块没有提供这样的安装方式,有些同学没能成功安装而导致无法在程序中引入模块.在这里,介绍一下python模块http://www.maiziedu.com/course/python/393-4380/几种常见的安装方法.   1. 直接copy 下

Python操作小结(连接mysql、解析txt文件)

有段时间没有使用python了,对它的语法有点生疏,花了几个小时熟悉,期间发现很多小细节不清楚.为了下次能快速上手,避免重复犯错,我将python使用过程中的一些问题在这篇博文中记录小结一下,主要内容涉及到python操作mysql数据库,和解析txt文本.注:我用的是python2.7版本. 一.导入模块 python的脚本文件里面,可以导入其他脚本文件,并引用其中的方法和参数,使用关键字import.如下: import os,glob,sys 二.基础语法 1.普通变量定义 python

Python 模块day13

模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了Python代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 例子 一个叫做aname的模块里的Python代码一般都能在一个叫aname.py的文件中找到.下例是个简单的模块support.py. def print_func( par ):    print "Hello :