zl程序教程

您现在的位置是:首页 >  后端

当前栏目

argparse模块和sys.argv和查看python解释器路径

Python模块 查看 路径 sys 解释器 argv
2023-09-14 09:14:57 时间

1.argparse模块

argparse 是一个用来解析命令行参数的 Python 库,它是 Python 标准库的一部分。argparse 模块使编写用户友好的命令行界面变得容易。程序定义了所需的参数,而 argparse 将找出如何从 sys.argv 中解析这些参数。argparse 模块还会自动生成帮助和使用消息,并在用户为程序提供无效参数时发出错误。

1.1简单实现圆柱体体积的计算

为了便于对argparse命令行参数解析模块的理解,我们先从一个简单的程序入手:

import math


def cylinder_volume(radius, height):
    vol = (math.pi) * (radius ** 2) * height
    return vol


if __name__ == '__main__':
    print(cylinder_volume(2, 4))

通过PyCharm执行代码,其显示的结果:
在这里插入图片描述

通过命令行的方式执行代码,其显示的结果:
在这里插入图片描述

可以看到如果使用命令行方式,需要先进入将要执行的xxx.py文件所在的文件目录下,并输入python xxx.py即可。

1.2使用argparse模块实现圆柱体体积的计算

  1. 导入argparse模块
import argparse
  1. 创建一个解析对象parser
parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')

其中,parser解析对象相当于一个用来装载参数的容器,而description用来描述解析对象。
3. 添加命令行参数

parser.add_argument('radius', type=int, help='Radius of Cylinder')
parser.add_argument('height', type=int, help='Height of Cylinder')
args = parser.parse_args()

在计算圆柱体体积的例子中,需要的参数由两个分别是radius和height,所以需要向解析对象中添加这两个参数,参数的类型定义为int类型,其中help用来对参数进行描述说明。
4. 将原函数实参换成命令行参数

print(cylinder_volume(args.radius, args.height))
  1. 完整代码复现
import math
import argparse

parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
parser.add_argument('radius', type=int, help='Radius of Cylinder')
parser.add_argument('height', type=int, help='Height of Cylinder')
args = parser.parse_args()


def cylinder_volume(radius, height):
    vol = (math.pi) * (radius ** 2) * height
    return vol


if __name__ == '__main__':
    print(cylinder_volume(args.radius, args.height))
  1. 执行代码

1.2.1基本代码

在PyCharm中直接执行代码,其结果显示:
在这里插入图片描述

PyCharm会直接报错,因为这段代码需要传入参数。
现在通过命令行的方式执行代码,其结果显示:

可以看见结果与之前的是一样的。
接着,我们可以调用–help或-h参数来查看程序的描述:
在这里插入图片描述

现在,我们尝试将先前传入的参数顺序进行改变,得到的结果如下:

在这里插入图片描述

1.2.2选择参数

可以看见结果就完全不一样了,从help中的提示信息知道,传入的参数需要按照严格的顺序进行,然而,在日常中,可能涉及到的参数数目较多,对于参数的顺序不是那么好记忆,这时我们可以对原先的代码进行修改,使其能使用选择性参数来进行:

parser.add_argument('-r', '--radius', type=int, help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, help='Height of Cylinder')

这里需要注意,由于 ‘-h’ 参数已经被help命令占用,所以对于height,我们使用 ’-H‘ 。
下面是再次执行代码的显示结果:

现在,我们通过 ’-h‘ 来查看程序的描述:

如果想让上面的描述看起来比较简洁,可以将代码进行修改:

parser.add_argument('-r', '--radius', type=int, metavar='', help='Radius of Cylinder')
parser.add_argument('-H', '--height', type=int, metavar='', help='Height of Cylinder')

现在,我们再次通过 ’-h‘ 来查看效果:
在这里插入图片描述

1.2.3设置必填 required=True

那现在如果只输入一个参数,结果会怎样呢?
在这里插入图片描述

可以看到报错信息中,那个没有具体指定数值的参数会被赋予None值,为了避免这种情况,我们可以对代码进行如下修改:

parser.add_argument('-r',
                    '--radius',
                    type=int,
                    metavar='',
                    required=True,
                    help='Radius of Cylinder')
parser.add_argument('-H',
                    '--height',
                    type=int,
                    metavar='',
                    required=True,
                    help='Height of Cylinder')

现在再来执行一次:
在这里插入图片描述

可以看到此时会提示需要添加的参数。

1.2.4互斥参数的介绍

现在我们尝试添加互斥组:

group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v', '--verbose', action='store_true', help='print verbose')
首先建立一个group容器,接着向其中添加参数,action参数赋值为store_true意味着当在命令中添加’-q‘或者’–quiet‘(’-v‘或者’–verbose‘)时,程序将对args.quiet赋值为true,而默认情况下为false。接着利用这一原理,我们就可以对main函数的内容进行修改:
volume = cylinder_volume(args.radius, args.height)
if args.quiet:
    print("quiet: %s" % volume)
elif args.verbose:
    print("verbose: %s" % volume)
else:
    print("Volume of a Cylinder with radius %s and height %s is %s" % (args.radius, args.height, volume))

现在进行命令行测试,查看效果:
在这里插入图片描述
需要注意的是,互斥的含义是指不能同时参入互斥组中的参数,即只有一个参数能成立,如果强行传入互斥组中两个以上的参数,则会出现如下错误提示:

import math
import argparse

parser = argparse.ArgumentParser(description='Calculate volume of a Cylinder')
parser.add_argument('-r',
                    '--radius',
                    type=int,
                    metavar='',
                    required=True,
                    help='Radius of Cylinder')
parser.add_argument('-H',
                    '--height',
                    type=int,
                    metavar='',
                    required=True,
                    help='Height of Cylinder')
group = parser.add_mutually_exclusive_group()
group.add_argument('-q', '--quiet', action='store_true', help='print quiet')
group.add_argument('-v',
                   '--verbose',
                   action='store_true',
                   help='print verbose')
args = parser.parse_args()


def cylinder_volume(radius, height):
    vol = (math.pi) * (radius**2) * height
    return vol


if __name__ == '__main__':
    volume = cylinder_volume(args.radius, args.height)
    if args.quiet:
        print("quiet: %s" % volume)
    elif args.verbose:
        print("verbose: %s" % volume)
    else:
        print("Volume of a Cylinder with radius %s and height %s is %s" %
              (args.radius, args.height, volume))

2.sys.argv

等同于shell里面的默认变量

#! /bin/bash

echo "文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4
import sys

print(sys.argv[0], sys.argv[1]) 
# 无参数的话会报列表越界 IndexError: list index out of range
import sys

command = sys.argv[1]
if command == 'modules':
    modules = sys.modules
    print(modules)
'''
'winreg' (built-in)>, 'time': <module 'time' (built-in)>, 
'zipimport': <module 'zipimport' (frozen)>,
'_codecs': <module '_codecs' (built-in)>, 'codecs': <module
'codecs' from 'F:\\python3.8\\lib\\codecs.py'>, 
'''
elif command == 'path':
    path = sys.path #   sys.path特指模块的查询路径的列表,初始化是从环境变量PYTHONPATH。
    print(path)
'''
['D:\\web前端应用课', 'F:\\python3.8\\python38.zip', 'F:\\python3.8\\DLLs', 
'F:\\python3.8\\lib', 'F:\\python3.8', 'F:\\python3.8\\lib\\site-packages', 
'F:\\python3.8\\lib\\site-packages\\tkbc-0.0.0-py3.8.egg']
'''
elif command == 'encoding':
    code = sys.getdefaultencoding()
    print(code)
'''
utf-8
'''
elif command == 'platform':
    print(sys.platform)
'''
win32
'''
elif command == 'version':
    print(sys.version)
'''
3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]
'''
else:
    print('该命令未识别')

3.查看 Python解释器路径的两种方式

3.1通过脚本查看

import sys
import os

print('当前 Python 解释器路径:')
print(sys.executable)
r"""
当前 Python 解释器路径:
C:\Users\jpch89\AppData\Local\Programs\Python\Python36\python.EXE
"""

print()
print('当前 Python 解释器目录:')
print(os.path.dirname(sys.executable))
r"""
当前 Python 解释器目录:
C:\Users\jpch89\AppData\Local\Programs\Python\Python36
"""

3.2直接在控制台查看

Windows 版:使用 where python

C:\Users\jpch89>where python
C:\Users\jpch89\AppData\Local\Programs\Python\Python37\python.exe
C:\Users\jpch89\AppData\Local\Programs\Python\Python36\python.exe