1. python如何在一个脚本修改另一个脚本的参数
一般情况下都是通过衡梁import脚本,然后直接调用脚本里的函数,调用函数就可以如睁直接传递参数;因为Python并不像C语言那样有main函数咐橡运。
import B(脚本名称)
B.hello(参数A,参数B)
2. python脚本入参的单、双引号
Linux的shell中存在一些特殊字符(保留字),我们将这些具有一些特殊功能的字符叫做meta(元字符),还有一些普通的,没有特殊功能的字符我们叫做literal(文字)。bash中,常使用的引用有如下三种方法:
1、单引号:单引号中的所有meta均被当作普通字符使用。
2、双引号:在双引号中的大部分meta都被当作普通字符,但某些字符的功能保留(如$)。
3、反斜线:只有紧接在反斜线(跳脱字符)之后的单一meta才被当作普通字符。
Windows的cmd下,同样也有类似的概念。单引号和双引号有时候没有区别(可以使用任意一个),有时候只能用特定的一个。
这篇文章主要记录python脚本入参带有&&符号时,在Linux和Windows平台的不同表现。
编写python脚本quote.py,内容如下:
$ cat quote.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print(sys.argv[1])
1、参数不使用引号
$ python quote.py whoami&&whoami
whoami
sunday
可以看出,第一个whoami被当作入参传给脚本,第二个whoami当作bash命令,在终端执行。
2、参数使用单引号
$ python quote.py 'whoami&&whoami'
whoami&&whoami
可以看出,&&被当作普通字符,whoami&&whoami作为参数传给了脚本。
3、参数使用双引号
$ python quote.py "whoami&&whoami"
whoami&&whoami
可以看出,&&被当作普通字符,whoami&&whoami作为参数传给了脚本。
在Windows执行脚本,用户为winsunday:
1、参数不使用引号
C:\test>python quote.py whoami&&whoami
whoami
winsunday
可以看出,第一个whoami被当作入参传给脚本,第二个whoami当作CMD命令,在终端执行绝或消。
2、参数使用单引号
C:\test>python quote.py 'whoami&&whoami'
'whoami
'whoami'' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
可以看出,并知单引号被当作普通字符,&&对命团猜令进行了分割,'whoami作为第一个参数被传给脚本;whoami'被认为是一个命令进行执行(报错了)。
3、参数使用双引号
C:\test>python quote.py "whoami&&whoami"
whoami&&whoami
可以看出,双引号时&&被当作普通字符,whoami&&whoami作为整体被传给脚本。
3. Python3脚本传参实战(2个方法3个传参列表的案例)
在一些测试平台对接时或者用例执行时,或多或少会用到Python脚本传参的问题。
test.py脚汪敬唯本
#!/usr/bin/python3
import sys
print ('参数个数为:', len(sys.argv), '个参数。')
print ('参数列表:', str(sys.argv))
print ('脚本名:', str(sys.argv[0]))
print ('第一个参数:', sys.argv[1])
执行python3 test.py arg1 arg2 arg3
参数个数为: 4 个参数。
参数列表: ['test.py', 'arg1', 'arg2', 'arg3']
脚本名: test.py
第一个参数: arg1
test.py脚本
#!/usr/bin/python3
import argparse
# 生成了一个命令行参数的对象
parser = argparse.ArgumentParser(description='Test for argparse')
parser.add_argument('--name', '-n', help='name属性,非必要参数')
parser.add_argument('--year', '-y', help='year 属性,非必要参数,但有默认值', default=2017)
parser.add_argument('--body', '-b', help='body属性,必要参数稿铅', required=True)
args = parser.parse_args()
print (args.year, args.name, args.body)
查看帮助python3 test.py --help
usage: test.py [-h] [--name NAME] [--year YEAR] --body BODY
Test for argparse
optional arguments:
-h, --help show this help message and exit
--name或-n NAME name属性,非必要参数
--year或-y YEAR year属性,非必要参数,但有默认值
--body或-b BODY body 属性,必要参数
执行python3 test.py --year 2021 -n robot --body "are you ok?"
2021 robot are you ok?
以方法2中的test.py脚本为例
python3 test.py --year 2021 --body [\"test\", \"robot\",\"boy\" ]
2021 ["test", "robot", "boy" ]
以方法1中的test.py脚本为例
python3 test.py [\"test\", \"robot\",\"boy\" ]
参数个数为: 2个参数。
参数列表: ['test.py', '[\"test\", \"robot\", \"boy\" ]']
脚本名: test.py
第一个参数: ["test", "robot", "boy" ]
其实此时传入的第一个参困培数是一个字符,需要转换为列表。
import json
json.loads(sys.argv[1])
test_arg.py脚本
#!/usr/bin/python3
import argparse
import os
# 生成了一个命令行参数的对象
parser = argparse.ArgumentParser(description='Test for argparse')
parser.add_argument('--body', '-b', help='body属性,必要参数', required=True)
args = parser.parse_args()
print (args.body)
command=python3 + ' ' + test_sys.py+ ' ' + args.body
print (command)
str=('command')
result=os.system(str)
test_sys.py脚本
#!/usr/bin/python3
import sys
import json
print ('第一个参数:', sys.argv[1])
print ('列表:', json.loads(sys.argv[1]))
执行python3 test_arg.py --body [\"test\", \"robot\",\"boy\" ]
python3 test_sys.py ["test", "robot", "boy" ]
test_sys.py执行报错,转json失败。
还记得我们案例2中,脚本的传入指定参数和实际传入参数嘛?
test_arg.py脚本我们稍微优化下,在传参前先字符替换下。
["test", "robot", "boy" ]转换为[\"test\", \"robot\",\"boy\" ]即可。
command.replace(' " ' , r ' \" ') 添加到command=之后,再次运行看看呢?
4. python 如何调用带参数的shell脚本
调用带参数的脚本,需要首先设置,举例如下:
test.py按行解释如下:
脚本中有汉字的话,需要声明文件编码格式;
导入sys模块,这个模块是用来获取参数列表的;
sys.argv是一个列表,第一个是文件名,之后依次是参数列表;
打印输出,这一步不需要多讲;
保存到c:usersYYCDesktop est.py;
调用操作步骤:
打开命令行;
输入python 文件名 第一个参数 第二个参数.....(参数之间用空格区分);
一定要注意参数个数,要以文件名开始。
5. python脚本中调用执行另一个带参数python脚本的问题
cmd='答禅/home/menglin/androguard/androaxml.py庆举链-i{}|grep"android.permission."'.format(path)
p1=subprocess.Popen(cmd,誉孙stdout=subprocess.PIPE,shell=True)
6. python开发命令行脚本
工作中会经常需要写一些命令行脚本,如果还是用if,else判断用户输入实在是太丑陋了。这里介绍几个python里的命令行脚本库,可以帮助我们快速开发好用的命令行脚本。
https://docs.python.org/3/library/cmd.html
使用方式是继承Cmd,实现自己的子类。
参数comletekey是自动补全操作,默认值是Tab, 如果不为None 且readline可用的话,命令会自动完成。
这里的readline指的是python实现的 GNU readline 接口(标准python库里没有,Windows系统不支持)。
参数stdin,stdout是输入输出流,默认是sys.stdin,sys.stout。
cmd提供了一个简单的框架,但是功能比较简单,python还有其他的很多第三方库可以用来写命令行程序。
https://www.cnblogs.com/xueweihan/p/12293402.html 这篇文章对比了各个库的功能,贴在这里:
看起来fire是最简单的,来试一下。
fire 则是用一种面向广义对象的方式来玩转命令行,这种对象可以是类、函数、字典、列表等,它更加灵活,也更加简单。你都不需要定义参数类型,fire 会根据输入和参数默认值来自动判断,这无疑进一步简化了实现过程。
以下示例为 fire 实现的 计算器程序:
从上述示例可以看出,fire 提供的方式无疑是最简单、并且最 Pythonic 的了。我们只需关注业务逻辑,而命令行参数的定义则和函数参数的定义融为了一体。
不过,有利自然也有弊,比如 nums 并没有说是什么类型,也就意味着输入字符串'abc'也是合法的,这就意味着一个严格的命令行程序必须在自己的业务逻辑中来对期望的类型进行约束。
7. Python语言命令行参数解析接收参数执行脚本的三种方法
在Windows系统上,Python脚本文件当然双击就能直接运行。不过我们往往需要在执行脚本的时候还要添加相应的参数,另外在Ubuntu系统中,我们执行文件往往和其他系统或用户命令一样,需要在终端中输入,参数当然也要一并加上。所以机智客这里说的意思是,执行Python脚本(.py文件)时候需要输入相应参数,这样程序怎么写的方法。
上面这么说可能有点不明不白的,或者有朋友会用但未必知道命令行解析这种表达方式。举个例子,比如我们在执行一个脚本文件的时候,可能会在CMD或者终端中输入python demo.py 10或者python demo.py --separator 10后面这个数字就是参数。我们要编写这样的脚本或者函数,有哪些方法呢?这里列举三种常用的。
一个是用系统模块sys。引入模块语句是import sys。也就是Python语言的内置库中的sys.argv。argv通常有argv[0],argv[1],argv[2]这样几个参数。基本使用方法是m_sil_len = int(sys.argv[1])传入第一个参数,sil_th = int(sys.argv[2])传入第二个参数。如果是简单一点的参数或者脚本,我们引入了sys。可以直接用这个传入参数。
一种是用模块argparse来实现,这是标准库中推荐的命令行解析模块。引入模块语句是import argparse。基本使用方法是引入模块后,先parser = argparse.ArgumentParser()创建对象,然后调用方法添加参数parser.add_argument("jzk", help="这是关于参数的说明", type=int),之后args = parser.parse_args()使用解析就可以用了。机智客看到这个方法在很多项目脚本中使用。我们在阅读机器学习AI之类的开源项目,就会发现很多人用的都是这个方法。
还有一个就是用fire模块,用于生成命令行界面的工具。引入模块语言是import fire。它默认以-为参数分隔符的。基本使用方法是fire.Fire()。这个不仅可以做命令行的参数解析,还可以还给一个类class添加命令行。所以使用时候括号里填入函数名或者类名即可,也就是里面的参数可以是其他Python对象。
8. 怎么在python脚本里面调用另外一个带参数的脚本
一般情况下都是通过import脚本,然后直接调用脚本里的函数,调用函数就可以直接传递参数;因为Python并不像C语言那样有main函数。
importB(脚本名称)
B.hello(参数A,参数B)
9. Windows10 中建立自动执行的python脚本,解决python不产生日志的问题
问题:按伍游照网上的教程,设置了自动执行的任亮首务,虽然脚本能运行,但是py文件并没有产生日志文件。
解决方法:在程序或脚本中 填写python.exe的绝对地址,我这里填写的是虚拟环境下的python地址
添加参数 : 这里填写脚本wind.py的绝对位置
起始于: 填写的是 日志产生文件的 位置。
由于我的脚本位置和 日志产生的位置是一样的。所以对于文件位置不一样的可能没有参考意义腔键销。
下面是运行后的结果:
10. 用Windows的“任务计划程序”执行Python脚本文件
整个任务计划设置一路下一步就ok了敬歼,几乎Xp之后每个版本的Windows设置都是差不多的。稍微提一下, 创建基本任务 和 创建任务 的区别是一个有引导界面,一个直接弹出设置界面直接设置。
出问题的是在这个界面的设置方法:
这里先引用一段其他文章里的设置方法:
上面的设置里问题还是挺多的,特别是关于 起始于 的解释。事实上这里的起始于并不是填写编译器所在的目录,编译器所在的目录实际上应该是在 程序与脚本 中就已经填写过了。而这里 起始于 要填写的内容应该是
同时,我们注意到,这里的选项后面有一个 (可选) ,意思是如果此处不填的话(缺省状态),那么自动将该处的目录位置定位到起始执行目录的位置(在 任务计划程序 执行的过程中通常是 编译器所在的目录位置 )。
其实这个跟python的一个内置模块有关。
os模块下我们经常用到的os.getcwd(),用于获取脚本当前目录位置;
而os.path.pardir可以获得当前脚本目录的上一级目录。
他们在一般双击运行的情况下的输出为(举例):
D:Python
..
而当使用编译器运行python脚本和直接双击执行python脚本时,os.getcwd()的输出结果是不一样的:
D:Python
C:
换句话说,在使用编译器执行时(即在cmd中执行 python D:Pythonpath.py ),os.getcwd()取的是python编译器所在的目录。 更一般的讲 ,os.getcwd()本身这个方法,返回的是当前执行python文件的文件目录, os.path.pardir同理 。一般情况下,打开脚本时,cmd会自动定位到当前脚本所在位置,类似使用了命令 cd D:Python ,所以执行目录就在脚本位置,所以输出 D:Python ;而当用 任务计划程序 执行时,其本质就是在cmd中将参数拼接,形成 python D:Pythonpath.py 这样的一条命令来运行程序,所以此时他返回的python的执行文件目录,就是python的安装目录 C: 。
因此我们需要定义 起始于 这个参数来告诉Windows实际的脚本位亮物冲置在哪里,否则就会出现找不到目标文件的错误。如果蚂卖脚本中没有牵涉到类似的目录位置等情况时(实际情况是这样的定时脚本大概率会遇到文件输入输出问题),此项大可以不填。
现在重新对这里的设置进行总结: