一文搞懂关于 sys.argv 的详解
作者:不渴望力量的哈 发布时间:2023-12-12 14:30:44
详解 sys.argv
关于 sys.argv 可得好好说道说道了。当初我可是被折磨的不要不要的,上一章节我们提到 argv 是获取程序外部的参数,返回值是一个列表。
说实话我一直在 python 解释器、idea 运行,试图从结果发现它的用途,然而结果一直都是没结果,也在网上查了许多资料,大部分都是转裁和复制的。给的都是简明python教程上那个一长串代码的例子,说看了就明白了,可我看得晕头转向的还是没真正明白,只知道 sys.argv[0]
表示当前脚本本身文件路径的该脚本文件。后来经过大量努力,多方求教才真正明悟了,谨以记录和分享,希望能从另一个角度给同在求索过程中的同学一点启发。
sys.argv 其实就是一个从程序外部获取参数
的桥梁,这里所说的 外部
很关键,所以那些试图从代码来说明它作用的解释一直没看明白。因为我们需要先在终端执行脚本, 并从外部传入参数(可以是多个),所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[ ]
提取其中的元素。其第一个元素是程序本身,随后才依次是外部传入的参数。
我们先来看一下 sys.argv 返回的是什么?
import sys
print(sys.argv)
# >>> 执行结果如下:
# >>> ['/Users/username/PycharmProjects/XXXXX/XXXXX/animal/package_sys.py']
# >>> 从执行结果可以看出 其输出的就是当前路径下的当前脚本本身,也就可以理解为 'sys.argv' 其实就是运行自身的脚本文件
# >>> 我们从 '外部' 运行该脚本文件的时候,需要传入参数(可以是多个)
接下来我们将上面的代码改为如下:
import sys
print(sys.argv[0], sys.argv[1])
# >>> 接下来我们进入 Terminal 终端 利用 python 执行 该脚本文件,并传入 测试参数,结果如下图。
为了更好的 演示 sys.argv 属性,我们将 sys 常用的函数与属性进行一下条件判断。示例如下:
import sys
command = sys.argv[1]
if command == 'modules':
modules = sys.modules
print(modules)
elif command == 'path':
path = sys.path
print(path)
elif command == 'encoding':
code = sys.getdefaultencoding()
print(code)
elif command == 'platform':
print(sys.platform)
elif command == 'version':
print(sys.version)
else:
print('该命令未识别')
然后在 Terminal 终端 执行该脚本,如下图:
看到这里 ,应该明白了吧?sys.argv 其实就是一个列表,里边需要用户传入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。
ps:sys.argv[]的用法
一、介绍
1、sys.argv 是获取运行python文件的时候命令行参数,且以list形式存储参数
2、sys.argv[0]表示代码本身文件路径
下面我们通过一个极简单的test.py程序的运行结果来说明它的用法
import sys
a=sys.argv[0]
print(a)
将test.py保存在c盘的根目录下。
在程序中找到 ‘运行’->点击->输入"cmd"->回车键 进入控制台命令窗口(如下图),先输入cd c:\ (作用是将命令路径改到c盘根目录),然后输入test.py运行我们刚刚写的程序:
这就是0指代码(即此.py程序)本身的意思。输出的就是test.py。
如果输入的是python c:\test.py,输出就是c:\test.py
然后我们将代码中0改为1 :
a=sys.argv[1]
保存后,再从控制台窗口运行,这次我们加上一个参数,输入:test.py what
得到的结果就是我们输入的参数what
二、简单的例子
#输入
$ python ./test.py aa bb cc
import sys
def main(argv):
print(argv[0]) aa
print(argv[1]) bb
print(argv[1:]) ['bb', 'cc']
print(argv[1][1:]) b
print('sys.argv[0]:',sys.argv[0]) #test1.py
print('sys.argv[1]:',sys.argv[1]) #aa
print('sys.argv[1:]:',sys.argv[1:]) #['aa', 'bb', 'cc']
print('sys.argv:',sys.argv) #['test1.py', 'aa', 'bb', 'cc']
print('type(sys.argv):',type(sys.argv)) #<class 'list'>
print('len(sys.argv):',len(sys.argv)) #4
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:])) #sys.exit(0)正常退出, sys.exit(1)非正常退出
从上面输出结果可以看出,
sys.argv[0]是当前所执行的脚本,并且输入什么就是什么,输入test.py就是test.py,输入./test.py就是./test.py
index 1以后的才是所传入的参数。用sys.argv[1:]可以获取到所有的参数,并且输出到一个列表里面。
三、输入为 --numa=1 --numb=2 形式和 --numa 1 --numb 2 形式
如果 python test.py --numa=1 --numb=2
则sys.argv[1:] 为 [test.py, --numa=1, --numb=2]
如果 python test.py --numa 1 --numb 2
则sys.argv[1:] 为 [test.py, --numa, 1, --numb, 2]
#输入
$ python test.py --numa=1 --numb=2
import sys
def main(argv):
print(argv[0]) --numa=1
print(argv[1]) --numb=2
print(argv[1:]) ['--numb=2']
print(argv[1][1:]) -numb=2
print('sys.argv[0]:',sys.argv[0]) #test1.py
print('sys.argv[1]:',sys.argv[1]) #--numa=1
print('sys.argv[1:]:',sys.argv[1:]) #['--numa=1', '--numb=2']
print('sys.argv:',sys.argv) #['test1.py', '--numa=1', '--numb=2']
print('type(sys.argv):',type(sys.argv)) #<class 'list'>
print('len(sys.argv):',len(sys.argv)) #3
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:])) #sys.exit(0)正常退出, sys.exit(1)非正常退出
==============================================================================
#输入
$ python test.py --numa 1 --numb 2
import sys
def main(argv):
print(argv[0]) --numa
print(argv[1]) 1
print(argv[1:]) ['1', '--numb', '2']
print(argv[1][1:])
print('sys.argv[0]:',sys.argv[0]) #test1.py
print('sys.argv[1]:',sys.argv[1]) #--numa
print('sys.argv[1:]:',sys.argv[1:]) #['--numa', '1', '--numb', '2']
print('sys.argv:',sys.argv) #['test1.py', '--numa', '1', '--numb', '2']
print('type(sys.argv):',type(sys.argv)) #<class 'list'>
print('len(sys.argv):',len(sys.argv)) #5
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv[1:])) #sys.exit(0)正常退出, sys.exit(1)非正常退出
来源:https://huskypower.blog.csdn.net/article/details/123649808


猜你喜欢
- 本文介绍在Anaconda环境下,安装Python中栅格、矢量等地理数据处理库GDAL的方法。  需要注
- 最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,
- 系列目录:1. 服务器XMLHTTP(Server XMLHTTP in ASP)基础2. 
- 解决Can't connect to MySQL server on 'localhost' (10048), 一般
- 引子首先说 正则表达式是什么?正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expres
- 需求分析现在是 "图片为王"的时代,在浏览一些网站时,经常会看到类似于这种满屏都是图片。图片大小不一,却按空间排列,就这
- 前言数据来源:population_data.json,先看一下数据长啥样[ { "Coun
- 从这里开始我的博客,后台数据库是什么?没错,就是MySQL,服务器端使用的脚本就是PHP,整个框架使用的是WordPress。PHP和MyS
- 近来,随着XHTML(可扩展HTML)标准的出现,<script/>标签也经历了一些改变。该标签不再用language特性,而用
- 问题描述有时候,产品让我们做的表格,会有合并列的功能,但是官方的demo略有不清晰,本文举个例子简述之。我们先看下效果图:假设产品的需求是这
- 爬虫思路初步尝试我先查看了network,并没有发现有可用的API;然后又用bs4去分析英雄列表页,但是请求到html里面,并没有英雄列表,
- 没怎么用过这个新特性,其实也不算新啦,试试吧,现在静态类的继承很方便了<?phpclass A { protected static
- 前言:Python是世界上最流行的解释型编程语言之一。Python 由 Guido van Rossum 设计,作为“ABC”编程语言的继承
- <input type="button" onclick="opened('ALERT'
- 问题一个已经有内容的 textarea 元素,在执行该元素的 .focus() 方法后,不同的浏览器有不同表现。我们的预期是能够出现在内容后
- 注:本文所说的视觉设计师专指网页视觉设计师。网页设计师与平面设计师都归类为设计师,其实这两个职业是跨行业的,虽然有很多设计师一直在跨行业工作
- (1)应用于客户需要与不同的数据源进行交互时。数据可能来自不同的数据库,他们都有各自不同的复杂格式。但客户与这些数据库间只通过一种标准语言进
- 本文带你快速了解@Async注解的用法,包括异步方法无返回值、有返回值,最后总结了@Async注解失效的几个坑。在 SpringBoot 应
- 1.使用npm进行初始化在本地创建项目的文件夹名称,如 node_test,并在该文件夹下进行黑窗口执行初始化命令 2. 安装 e
- 需求描述数据库中 num字段值为:实现的效果:需要将一行数据变成多行实现的sqlSELECT SUBSTRING_INDEX(SUBSTRI