python调用自己写的py文件

python调用自己写的py文件

目录

python如何调用自己写的py文件呢?

如果是不同目录怎么调用呢?

如果需要调用的多个文件在多个目录呢?

关于__init__.py的解释

关于sys.path的解释


python如何调用自己写的py文件呢?

同一个目录下直接写import xx就好了,xx为自己要调用的模块名字,虽然会有下划线报错,其实,没有错,仍然可以调用,之前一直都被报错吓住了

如果是不同目录怎么调用呢?

那就把需要调用的那个目录添加一下,比如调用C:\xxx\a.py

那就添加一下c:\xxx路径(windows的路径和linux的路径符号不同\\,/,注意区别)

然后import a就行了,前面写r是为了告诉python这是路径,别把\n等特殊组合给转译了,

如果同c:\xxx目录下有多个文件,比如a.py,b.py等等,也可以直接导入了,因为这是告诉python去这个文件夹寻找包文件

import sys
sys.path.append(r"C:\xxx")
import a
import b

如果需要调用的多个文件在多个目录呢?

当然可以多次写sys.path.append(r”C:\xxx”)来添加多个目录,

但是这样很麻烦,如果文件距离很近,比如这样就没有必要写

python调用自己写的py文件

解决方法是添加一个空的__init__.py文件(用于定义包的属性和方法,可以为空),表示这是一个包,比如这样,声明了aaa为一个包,a是内部的方法

python调用自己写的py文件

也可以这样,表示bbb是一个包,bb是bbb的子包,b是bb包的内部的方法

python调用自己写的py文件

然后如果你需要调用a.py与b.py,就可以

testcode.py

import aaa.a
import bbb.bb.b
import ccc.c

如果你在c.py文件,想要调用a.py,b.py只需要用到步骤2的知识即可,比如

c.py

import sys
#添加上级目录
sys.path.append("..//")
import aaa.a
import bbb.bb.b

关于__init__.py的解释

作用是将文件夹变为一个Python模块,导入包时,事实上是导入了它的__init__.py文件

__init__.py 文件可以为空,但是也可以添加如下两个功能

1.初始化包中各个模块,批量导入

pack包,配置__init__.py


import a
import b

导入pack包

访问__init__.py文件中的引用文件,需要加上包名

import pack
print(pack.a,pack.b)

2.__init__.py中的__all__,全部导入所声明的模块

此时导入pack包就相当于导入了a.py,b.py,c.py

pack包,配置__init__.py

__all__ = ['a', 'b', 'c']

 调用

from pack import *

关于sys.path的解释

当导入模块时,解释器按照sys.path列表中的目录顺序来查找文件。

print(sys.path)

会打印出一个list列表,表示引入文件时查找的文件目录,第一个元素空字符表示当前目录 

关于pyc与pyo文件

pyc就是py编译时生成的字节码文件,以后每次导入都会执行pyc,当py文件更新时pyc也会更新

如果解释器添加-o命令,py编译时会生成pyo文件,它相比pyc去掉了断言(assert)、断行号以及其他调试信息,运行速度更快

如果使用-OO选项,生成的pyo文件会忽略文档信息

模块导入时内部的原理

import可导入的对象可以是以下类型:

模块文件(.py文件)

C或C++扩展(已编译为共享库或DLL文件)

包(包含多个模块)

内建模块(使用C编写并已链接到Python解释器中)

理解为后缀就是.py、.pyo、.pyc、.pyd、.so、.dll

解释器工作:

1.根据导入的文件名创建命名空间(用来访问文件内部属性与方法)

2.在命名空间内执行源代码

3.创建一个源代码文件的对象,这个对象引用对应的命名空间,管理模块的内部函数与变量

4.一个模块可以多次导入,但是后面导入的模块只执行第三步

sys.modules可以打印出导入的模块名与模块对象的映射

因此可以理解导入文件的三种方式:

import a.b

把a.b导入全局命名空间,想要调用c方法需要a.b.c

from a import b

把b导入全局命名空间,b.c

from a.b import c

把b的属性c直接导入命名空间

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100256.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php 从第几个字符替换,php中几个字符串替换函数详解[通俗易懂]

    php 从第几个字符替换,php中几个字符串替换函数详解[通俗易懂]在php中字符替换函数有几个如有:str_replace、substr_replace、preg_replace、preg_split、str_split等函数,下面我来给大家总结介绍介绍.一、str_replace(find,replace,string,count)作用:str_replace()函数使用一个字符串替换字符串中的另一些字符。参数描述find必需,规定要查找的值.repla…

    2022年5月13日
    59
  • angularjs子组件向父组件传值_react子组件传值

    angularjs子组件向父组件传值_react子组件传值Angular父组件给子组件传值的方法与注意事项

    2025年9月11日
    6
  • ov7725摄像头人脸识别_ov7725摄像头

    ov7725摄像头人脸识别_ov7725摄像头OV7725摄像头软件实现简单的二值化处理项目使用的摄像头型号:​ 正点原子OV7725摄像头模块,带FIFO的摄像头模块。图像二值化化的个人见解:​ 常见的图片格式:​ 黑白图片、灰度图片、彩色图片。不同的图片的格式类型主要的不同点在每个像素点需要几位的二位数来表示。黑白图片每个像素不是0就是1,0代表黑颜色,1代表白颜色。灰度图像每个像素需要一个字节表示(8位二进制)每个像素可以量化…

    2025年11月29日
    7
  • WIFI 简单的连接及常用密码破解

    WIFI所需权限及配置<uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/><u

    2022年4月13日
    63
  • Git 分支合并分支代码

    Git 分支合并分支代码git分支合并分支

    2025年6月19日
    4
  • static–静态变量与普通变量的区别

    static–静态变量与普通变量的区别静态变量与普通变量的区别全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,…

    2022年5月3日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号