2020-09-10 blog

今天上的课:

  • 1-2 内科学
  • 3-4 传染病学
  • 5-6 卫生学

今天研究了一下如何在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()

今天是教师节,以前都是我跟别人说“教师节快乐”。
没想到今天反过来,收到了节日祝福。
虽然感觉自己也没教什么。

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注