首页 > 编程语言 >python 脚本的启动模式(python -m以模块方式启动)

python 脚本的启动模式(python -m以模块方式启动)

时间:2023-12-15 15:45:54浏览次数:36  
标签:__ opt lib 启动 python py anaconda3 模块

今天再看python的项目时,发现GitHub中给出的python脚本的执行格式是python -m pip install somepackage。于是开始了python模式启动之旅。

其中很多相关借鉴了该博客,同时感谢博主:http://www.cnblogs.com/xueweihan/p/5118222.html

  • 什么是python启动模块:

通过python启动一个库中的模块(python启动模块):

python -m http.server    (python3中启动一个简单的http服务器)

  • 关于python的模块方式启动

python 的启动方式(加载py文件方式)有两种:

 

  1. python xxx.py  -----直接运行的方式启动(此时脚本__name__为"__main__")
  2. python -m xxx.py  ------以模块的方式启动(此时脚本的__name__属性值依然不再是"__main__"而是"xxx")

附:__name__ == "__main__"表示该脚本为程序的主入口,否则是以模块调用的形式运行。

区别1:

关于两种启动方式的差异,主要是所加载的系统路径不同(sys.path列表):(通过列子做了验证)

在/home/spark/cluster-master/examples下建立test.py脚本,内容:

 
  import sys   print(sys.path)
 
   

1、直接运行:python test.py结果:

['/home/spark/cluster-master/examples', '/home/spark/cluster-master', '/data/lthpc/soft/caffe/python', '/opt/anaconda3/lib/python36.zip', '/opt/anaconda3/lib/python3.6', '/opt/anaconda3/lib/python3.6/lib-dynload', '/opt/anaconda3/lib/python3.6/site-packages', '/opt/anaconda3/lib/python3.6/site-packages/Sphinx-1.5.6-py3.6.egg', '/opt/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg', '/opt/anaconda3/lib/python3.6/site-packages/torchvision-0.1.9-py3.6.egg']
   

2、以模块方式运行 :python -m test结果:

['', '/home/spark/cluster-master/examples', '/data/lthpc/soft/caffe/python', '/opt/anaconda3/lib/python36.zip', '/opt/anaconda3/lib/python3.6', '/opt/anaconda3/lib/python3.6/lib-dynload', '/opt/anaconda3/lib/python3.6/site-packages', '/opt/anaconda3/lib/python3.6/site-packages/Sphinx-1.5.6-py3.6.egg', '/opt/anaconda3/lib/python3.6/site-packages/setuptools-27.2.0-py3.6.egg', '/opt/anaconda3/lib/python3.6/site-packages/torchvision-0.1.9-py3.6.egg']
   

注意不同之处来了:直接运行后添加到path中的路径为”脚本所在路径“,而以模块方式运行后多了一个‘ ’,这个‘ ’符号代表python执行运行环境的当前路径(即为python的执行路径),就是这个‘ ’当前路径引出了import包时的很多问题。下面用例子说明:

下面的例子我在服务器上没有验证成功,先姑且贴一下别人的例子:

 
  # 目录结构如下   package/   __init__.py   mod1.py   package2/   __init__.py   run.py
 
   
 
  # run.py 内容如下   import sys   from package import mod1   print(sys.path)
 
   

 

两种启动:

 

 
  # 直接启动(失败)   ➜ test_import_project git:(master) ✗ python package2/run.py   Traceback (most recent call last):   File "package2/run.py", line 2, in <module>   from package import mod1   ImportError: No module named package       # 以模块方式启动(成功)   ➜ test_import_project git:(master) ✗ python -m package2.run   ['',   '/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',   ...]
 
   

启动成功与否的关键是在run.py脚本中的import 内容能否成功地加入到sys.path中。

显然from package import mod1,在sys.path中存在' '当前路径的情况下是能够找到对应包的,而另一种方式找不到包,原因在于python 的模块搜索路径机制:

区别2:

  • 当加上-m参数时,Python会先将模块或者包导入,然后再执行。

假设我们有如下一个包package

 
  package   ├── __init__.py   └── __main__.py
 
   

__init__.py的内容

 
  import sys       print("__init__")   print(sys.path)
 
   

__main__.py的内容

 
  import sys       print("__main__")   print(sys.path)
 
   

使用python -m package运行,输出结果:

 
  __init__   ['', ...]       __main__   ['', ...]
 
   

使用python package运行,输出结果:

 
  __main__   ['package', ...]
 
   

这里涉及到__main__为名称的模块,__main__.py文件是一个包或者目录的入口程序。不管是用python package还是用python -m package运行,__main__.py文件总是被执行。 

 

在一个模块被导入时,PVM会在后台从一系列路径中搜索该模块,其搜索过程如下:

1、在当前目录下搜索该模块;

2、在环境变量PYTHONPATH中指定的路径列表中依次搜索;

3、在python安装路径中搜索

      事实上,PVM通过变量sys.path中包含的路径来搜索,这个变量里面包含的路径列表就是上面提到的这些路径信息。

 

标签:__,opt,lib,启动,python,py,anaconda3,模块
From: https://www.cnblogs.com/lidabo/p/17903486.html

相关文章

  • BOSHIDA DC电源模块的设计与制造技术创新
    BOSHIDADC电源模块的设计与制造技术创新DC电源模块的设计与制造技术创新主要涉及以下几个方面: 1.高效率设计:传统的DC电源模块存在能量转换损耗较大的问题,技术创新可通过采用高效率的电路拓扑结构、使用高性能的功率开关器件和优化控制算法等手段来提高能量转换效率,降低能量......
  • python远程关闭window电脑
    背景公司的电脑机器太多,每次关闭的时候需要一台一台的关闭,比较麻烦,因此做一个批量关闭的功能Windows电脑不想liunx有ssh工具,因此需要事前在Windows电脑上面安装一个ssh工具。1、Github上下载OpenSSH包下载地址 https://github.com/PowerShell/Win32-OpenSSH/releases2......
  • springcloudalibabada搭建过程中springboot启动卡住起不来 (Started MoonceProviderApp
    如下图一样springcloudAlibaba在创建新模块之后启动新模块没有注册到nacos上,而是直接卡住起不来原因 原因是:引入了错误的web包: 解决办法:引入相应的 spring-boot-starter-web包:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot......
  • VMware Workstation 17中设置虚拟机开机自启动
    VMwareWorkstation17中设置虚拟机开机自启动的步骤如下:打开VMwareWorkstation17。在左侧导航栏点击配置自动启动虚拟机。然后选择要自动启动的虚拟机并配置启动顺序,点击确定。设置自动启动服务。打开任务管理器,点击服务,找到VmwareAutostartService,右键,点击开始。找到VMware......
  • python 遍历文件目录下所有的文件夹和文件
    前言一些场景需要查找文件目录下一些文件,一、需要库os二、参考代码#(root,dirs,files)分别为:遍历的文件夹,遍历的文件夹下的所有文件夹,遍历的文件夹下的所有文件importpath="D:\脚本\微信"forroot,dirs,filesinos.walk(path+"/"):#iflen(dirs)==0:print(roo......
  • 05-模块和包的概念
    模块和包模块是python的源文件,即.py文件。模块支持导入,一个模块可以导入其他系统提供或第三方模块,可以使用其中提供好的全局变量、函数等。若导入的模块名字过长,也可以使用as使用别名。import会导入一个模块中所有内容,如果只想使用部分内容,可使用from模块import部分这......
  • python连接pgsql&mysql
    1、python连接pgsqlimportpsycopg2defconnect_pgsql(list_sql):conn=psycopg2.connect(host='db_host',user='db_user',password='db_passwd',......
  • Seata 启动报错:[imeoutChecker_1] i.s.c.r.netty.NettyClientChannelManager : no av
    Seata启动报错:[imeoutChecker_1]i.s.c.r.netty.NettyClientChannelManager:noavailableservertoconnect.1.问题2.解决【application.xml和file.conf参数要相对应】......
  • Python 如何修改并存储 json文件内容 - json package 使用
     直接上代码:importjsondefjson_load(json_file):withopen(json_file,'r')asfh:content=json.load(fh)returncontentfh.close()defjson_save(json_file,data):withopen(json_file,'w',encoding='UTF-8')asf:......
  • 04-python基础
    类与对象python中同样存在类和对象的概念,在python的类中,通过class创建声明类,类中存在构造函数和析构函数,而且存在一个类似于Java中的toString。def__init__(self)def__del__(self)def__str__(self)self是python中类似于其他语言中this的功能。类成员变量就通过这个s......