fx – python脚本管理
今天研究了一下如何在CMD里面直接输入fx
而不是python -m fx
来启动。
搜了一下网上的各自资料,发现少得可怜。不知道是不是比较少有这种需求。而且有一些相关的,点进去之后文章也不会说具体是怎么做的,简单来说就是比较像是单纯的“展示”而不是教程。(特别烦这种文章)
于是自己研究了一下。
首先的思路是,在任意一个位置建一个文件夹,然后将这个文件夹添加到系统环境变量的PATH中。然后在这里面新建一个叫fx.bat
的批处理脚本。这样就可以在cmd里面直接执行fx
命令了。
然后是fx.bat
的内容
@echo off
python -m fx %*
goto :eof
注:使用%*
来讲cmd里面的所有参数传递给fx
折腾一番之后,发现脚本可以非常正常地执行。但是我又有了一个新的需求,那就是python环境。
上述脚本运行的时候,使用的是默认python环境,而如果我需要使用其他python环境的话就比较麻烦了。
因此新的脚本需求是:在运行fx
的时候,输入一个env=ENV
来指定相应的conda环境,并且自动切换到相应conda环境运行python。并且这个env=ENV
的键不会被当作fx
的参数传入到fx中。
一开始我的想法是,在bat里面自己判断输入参数中是否包含env=
,并进行分离、切割、传递。然后我发现在bat里面编写这个功能非常麻烦,折腾了几个小时无果。
最终是在文件夹里面写了一个python脚本来处理这个功能。逻辑如下:
通过cmd输入fx的时候,调用的是fx.bat
。批处理脚本运行同目录下的fx_env.py
,并传入所有输入参数。
@echo off
python %~dp0fx_env.py %*
goto :eof
fx_env.py
接收到输入的参数之后,进行解析,并执行cmd命令。逻辑是:
- 通过
sys.argv
获取所有的输入参数 - 分析输入的参数,如果不包含env关键字,使用默认的conda环境
- 如果包含env关键字,那么将使用指定的conda环境,并且将env键从参数列表中踢出。
- 解析完成之后,运行两条cmd命令,第一条是切换到相应的conda环境。如果不存在对应环境,则停留在系统默认python环境中。第二条与上面的方案一致。
import os
import sys
class Parser:
def __init__(self):
self.env = 'fx'
self.args = sys.argv[1:]
self.expression = ''
def parse(self):
for arg in self.args:
if arg.startswith("env="):
self.env = arg.split("=")[-1]
self.args.remove(arg)
self.expression = ' '.join(self.args)
def run(self):
os.system(f"call conda activate {self.env}")
os.system(f"python -m fx {self.expression}")
if __name__ == "__main__":
parser = Parser()
parser.parse()
parser.run()