一般来说,python代码作为脚本在执行的时候会直接使用下面的语句执行,但是当python代码功能越多,越复杂时,就需要专门的执行文件,便于代码的执行和移植。
python xxx.py
之前基本使用linux服务器执行python代码,当执行代码传入参数较多时,为避免每次输入命令的复杂,如下
python xxx.py --a --b --c --d --e
会将python代码的执行命令写入到.sh文件中,把执行路径、运行环境、传入参数等直接写入一个LF格式的.sh文件中,直接在命令行执行如下语句即可,非常省事,传入的参数直接在文件内改就可以,不需要每次重新敲进去
bash xxx.sh
这是在linux系统,最近在windows系统部署环境后,也需要实现在linux的类似功能,直接执行一个文件就可以激活环境,进入执行路径下并执行路径下的python代码。但是windows不能再使用.sh文件了,需要用.bat文件,由于第一次写,花了一点时间摸索。查网上的资料也没多少类似的情况,现在暂记,以便后用。
windows系统的bat文件可通过cmd直接执行,也可直接双击该文件进行执行,所以文件中必须声明执行代码的路径,需要激活的特定的虚拟环境以及执行该python代码的相关传入参数等。
关于python代码中传入参数的方式,我尝试过使用sys库和argparse库两种方式,第一种sys.agrv[]:
import sys
def main():
aa, bb, cc, dd = get_argv(sys.argv)
...
def get_argv(argv):
aa = argv[1]
bb = argv[2]
cc = argv[3]
dd = argv[4]
return aa, bb, cc, dd
执行代码时的命令:
python xxx.py aa bb cc dd
第二种是用argparse库,用这种方法的好处是,有的参数可以进行预设,当命令行没有对应的输入时,就会默认采用预设的参数,其传参方法:
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--aa",type=(int/float/str etc.),default = 1, help="需要传入的参数说明")
parser.add_argument("--bb",type=(int/float/str etc.),default = 1, help="需要传入的参数说明")
parser.add_argument("--cc",type=(int/float/str etc.),default = 1, help="需要传入的参数说明")
parser.add_argument("--dd",type=(int/float/str etc.),default = 1, help="需要传入的参数说明")
args = parser.parse_args()
执行代码时的命令:
python xxxx.py --aa xxx --bb xxx --cc xxx --dd xxx
xxx为具体的指代参数
从上可发现这两种方式基本是大同小异,sys可以直接传入参数,但是要严格对应参数的顺序,不能对应错了。argparse传入参数要声明传入某个参数(–aa)的对应值,可不用按顺序。
我这里要用到anaconda安装的虚拟环境,并执行带传参的python代码,把上述功能写入一个bat文件可以如下:
@echo off
C:
cd C:\source\python-file\
call activate D:\conda_env\env_name
python xxx.py
cmd /k
其中:
@echo off:
DOS在运行批处理时,会依次执行批处理中的每条命令,并且会在显示器上显示,如果你不想让它们显示,可以加一个“echo off”,当然,“echo off”也是命令,它本身也会显示,如果连这条也不显示,就在前面加个“@”。pause使显示器停下,并显示“请按任意键继续_ _ _”
C:
驱动器位置,代码所在大盘。如c盘、D盘
*cd C:\source\python-file*
要执行的python代码所在的具体位置
call activate D:\conda_env\env_name
激活虚拟环境的命令,定位其位置,直接激活环境名
python xxx.py
要执行的python命令,具体执行时,根据传参方式应修改为:
python xxx.py aa bb cc dd
或
python xxxx.py --aa xxx --bb xxx --cc xxx --dd xxx
也就是只需要修改上述的执行python代码命令,在后面加上传入的参数,这样才能正常执行,否则报错。
其实可以发现,最后的这条命令和在linux命令行直接输入的命令是一样的,只是提前把参数写入了bat文件,还要摸索一下一下怎么通过bat文件读入新赋予的参数来执行python代码。