python 模块

Python模块

  模块是一个包含一系列数据、函数、类等组合的程序组,可以供给其他模块或文件使用

模块的分类:

  • 内建模块(builtins)    在解析器内可以直接使用
  • 标准库模块,    安装python时已安装且可以直接使用
  • 第三方模块(通常开源)    需要自己安装
  • 用户自己编写的模块(可以作为其他人的第三方库)

pip

moudle_name: 是对应的模块名;请自行更换为自己需要更新的模块名

安装对应的模块: pip install moudle_name 

查看所有模块 pip list 

更新所有的模块  pip-review --local --interactive 

更新某一个模块 pip install --upgrade module_name 

指定镜像源更新模块 pip install moudle_name -i https://pypi.douban.com/simple 

pip国内的一些镜像

永久更改镜像

linux:

修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

windows: 

直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,在pip 目录下新建文件pip.ini,内容如下

或者按照网友的建议:win+R 打开用户目录%HOMEPATH%,在此目录下创建 pip 文件夹,在 pip 目录下创建 pip.ini 文件, 内容如下

[global]
timeout = 6000
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn

清除缓存

查看缓存信息 pip cache info 

还有指令可以查看 cache 列表和路径

pip cache list
pip cache dir

使用下面指令可以清除缓存  pip cache purge 

对于 ubuntu,可以直接删除缓存所在文件夹

sudo rm -rf ~/.cache/pip

对于 win,可以直接删除缓存所在文件夹

C:\Users\your_name\AppData\Local\pip\cache

调用模块

引用模块: import module1 

调用模块:模块名.函数名

语法:

 import 模块名 [as 模块新名] 

 from...import... 语句 

 from...import * 语句   把一个模块里的所有内容导入到当前命名空间,直接调用函数就行,不用模块.函数,一般不建议使用

内建模块————数学模块 math

cmath.sqrt(number)——返回平方根,可用于负数

abs(number)——返回指定值的绝对值

math.e——自然对数的底e

math.pi——圆周率pi

内建标准库模块——时间模块  time

计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1(UTC时间),比中国时间晚8个小时

注:CST为中国标准时间(China Standard Time UTC +8:00)

 time.time()  返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准)
 time.sleep(miao)  让程序按给定secs秒数的浮点数睡眠一段时间
 time.asctime([tuple])  将9个元素时间元组转换为(美国时间格式) Wed Jul 18 13:21:58 2018不给参数返回当地当前时间(美国时间格式)
 time.mktime(tuple)  将本地9个元素日期时间元组转换为UTC时间(秒)
 time.gmtime(miao)  用给定秒数转换为UTC表达的9元素时间元组 (缺省返回当前时间元组)(不写参数时,返回当前时间元组)time.struct_time(tm_year=2018, tm_mon=7, tm_mday=18, tm_hour=13, tm_min=9, tm_sec=41, tm_wday=2, tm_yday=199, tm_isdst=0)
 time.localtime(miao)  返回9个元素的时间元组,缺省时默认返回本地的当前时间 将UTC秒数时间转换为日期元组(以本地时间为准)

模块包——paockage

  包就是文件夹,是包的文件夹必须存在__init__.py文件,通常放包的文档字符串,该文件的内容可以为空__int__用于标识当前文件夹是一个包,__init__会在包加载时自动调用,有利于防止命名冲突,可以在需要时加载一个或部分模块而不是全部模块

举个栗子:

test.py
package_runoob
|-- __init__.py
|-- runoob1.py
|-- runoob2.py

package_runoob/runoob1.py

1 def runoob1():
2    print "我是模块1"

package _runoob/runoob2.py

1 def runoob1():
2    print "我是模块2"

 在 package_runoob 目录下创建 __init__.py,有这个文件证明package_runoob是一个模块包

4 if __name__ == '__main__':
5     print '作为主程序运行'
6 else:
7     print 'package_runoob 初始化'

 然后我们在 package_runoob 同级目录下创建 test.py 来调用 package_runoob 包

4 # 导入 Phone 包
5 from package_runoob.runoob1 import runoob1
6 from package_runoob.runoob2 import runoob2
7  
8 runoob1()
9 runoob2()

 以上实例输出结果:

package_runoob 初始化
I'm in runoob1
I'm in runoob2

包的导入

import xx

   import 包名 [as 包新名]

   import 包名.模块名 [as 模块新名]

   import 包名.子包名.模块名 [as 模块新名]

from xx import  xx

   from 包名 import 模块名 [as 模块新名]

   from 包名.子包名 import 模块名 [as 模块新名]

   from 包名.子包名.模块名 import 属性名 [as 属性新名]

   from 模块名 import 函数名

from xx import * 

   from 模块名 import *

   from 包名 import *

   from 包名.模块名 import *

python 导入包时搜索路径的顺序:

  1. 搜索程序的当前路径
  2. sys.path 提供的路径

__init__.py内的__all__列表

  作用:用来记录此包中有哪些子包或者模块在用from import* 语句时被导用

  说明:__all__列表只对 from xxx import *语句起作用

包的相对导入是指包内模块的相互导入

  语法:

    from 相对路径包或模块 import 属性或模块名
    from 相对路径包或模块 import *

  相对路径:

  .代表当前目录

  .. 代表上一级目录

  ... 代表上二级目录

  .... 以此类推

  注:相对导入时不能超出包的外部

python一般默认是绝对路径导包的

搜索路径

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  • 1、当前目录
  • 2、如果不在当前目录,sys.path提供的路径,sys.path是一个列表,里面放着都是模块的搜索路径,
  • 3、如果都找不到,Python会察看默认路径,也就是内建模块。UNIX下,默认路径一般为/usr/local/lib/python/。

模块搜索路径存储在sys模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

python的环境变量(就是路径)  set PYTHONPATH=c:\python27\lib;

模块的加载过程

  1、在模块导入时,模块的所有语句都会执行一边

  2、如果模块已经导入那么在此导入不会重新执行模块内的语句

模块导入和执行的过程

  1、先搜索相关的路径,找到模块名.py

  2、判断是否由此模块对应的.pyc文件。如果.pyc文件比.py文件新,则直接加载.pyc文件

  3、否则用模块.py文件,生成.pyc文件,并加载执行

pyc python的编译
         编译        解释执行
mymod.py --------> mymod.pyc --------> python3

 

模块的预置属性

  模块的__doc__属性绑定此模块的文档字符串    print(__doc__)  #我是文档字符串

  模块的__file__属性记录模块对应的文件路径名     print(__file__)      #D:/Users/Never/PycharmProjects/Tedu/day13/练习.py

  模块的__name__属性 用来记录模块自身名字    print(__name__)  #'__main__'

     用处:1、记录函数名

        2、用来判断是否为主模块

    说明:1、当此模块为主模块(也就是第一个运行的模块时)运行时,__name__绑定的是__main__

       2、当此模块不是主模块时,而是被其他模块导入时,此时__name__绑定模块名

模块的属性调用时,就不需要使用模块名.属性

 

模块的__all__列表

  模块中的__all__列表是一个用来存放可导出属性的字符串列表

作用:当用from 模块名 import * 语句导入模块时,只导入__all__列表里面的属性(注意是模块名不是包名)

bk.py文件

# __all__属性只对 from import * 语句有效
__all__ = ['hello1', 'name1']

def hello1():
    print("1")

def hello2():
    print("2")

def hello3():
    print("3")

name1 = 'aaaaaa'
name2 = 'aaaaaa'

wo.py文件

from bk import*
hello1()
print(name1)

 

模块的隐藏属性  模块中以‘_’开头的属性,在from 模块名 import *或者from...import...导入时,将不被导入,通常称这些属性为隐藏属性

 

reload()函数

当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。

因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:

  import imp

  imp.reload(module_name)

在这里,module_name要直接放模块的名字,而不是一个字符串形式,也不是字符串名。

help(obj)函数可以查看模块的相关文档字符串

dir( )函数:返回的是一个列表,容纳了括号中模块包含的所有变量、函数和模块

 1 import math
 2 content = dir(math)
 3 print(content)
 4 '''
 5 ['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
 6 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
 7 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
 8 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
 9 'sqrt', 'tan', 'tanh']
10 '''
11 
12 dic()
dic()

在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的路径

globals()和locals()函数

根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。

如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。

如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。

两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。

多模块项目设计时,不要用global定义全局变量,可以用函数传参传入全局变量,全局变量写在main模块里面,然后main()调动主模块

如果实在没办法,可通过stdu.name = 2类似的方法把模块stud的name值调过来

创建pip包

将自己的项目上传到PyPI(Python Package Index),可以让其他人方便地安装和使用你的Python包。下面是详细的步骤:

1. 准备项目文件

确保你的项目目录包含以下文件:

  • setup.py:项目的配置文件。
  • README.md:项目的介绍文件(可选,但推荐)。
  • LICENSE:许可证文件(可选,但推荐)。
  • 其他项目源代码文件和资源。

2. 编写 setup.py

setup.py 是Python包的配置文件,内容通常如下:

from setuptools import setup, find_packages

setup(
    name="your_package_name",
    version="0.1.0",
    description="A short description of your package",
    long_description=open('README.md').read(),
    long_description_content_type='text/markdown',
    author="Your Name",
    author_email="your_email@example.com",
    url="https://github.com/yourusername/your-repo",
    packages=find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

3. 安装必要工具

安装 setuptoolswheeltwine 这三个工具:

pip install setuptools wheel twine

4. 构建项目分发档案

在项目根目录下运行以下命令,生成分发档案:

python setup.py sdist bdist_wheel

这会在 dist 目录下生成 .tar.gz.whl 文件。

5. 注册PyPI账号

如果你还没有PyPI账号,请访问 PyPI官网 注册一个账号。

目前PyPi强制要求双因素认证(2FA),这一变化虽然提高了安全性,但也给日常工作带来了麻烦。

第一步:配置恢复代码

请妥善保存这些代码,它们是你在遇到问题时重置 2FA 的关键!

第二步:添加 2FA

安装 Python 包 pyotp 来生成 2FA 验证码。复制应用代码,并编写 Python 脚本获取验证码。

import pyotp

key = '粘贴 2FA 代码'
totp = pyotp.TOTP(key)
print(totp.now())

6. 上传到PyPI

使用 twine 将生成的分发档案上传到PyPI:

twine upload dist/*

此时会提示你输入PyPI的用户名和密码或者API。上传成功后,你的包就会在PyPI上可用了。

7. 测试上传到 TestPyPI(可选)

在正式上传到PyPI之前,可以先上传到 TestPyPI 进行测试:

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

你需要在 TestPyPI 上注册一个账号,注册地址:TestPyPI

需要输入API Token,我们把API Token复制到剪切板,然后点击输入密码的地方右键就行,不用Ctrl+C

8. 安装或升级你的包

上传成功后,可以用 pip 安装并测试你的包:

pip install [--upgrade] -i https://test.pypi.org/simple/ your_package_name

通过这些步骤,你应该能够成功地将自己的Python包上传到PyPI。

 

posted @ 2018-07-15 15:06  凌逆战  阅读(539)  评论(0编辑  收藏  举报