1. 背景介绍
距离第一次遇到这个问题其实已经有段时间了,只不过我一直没理会。今天重新振作,试着研究了以下这个问题。
我一直用anaconda配合vscode来开发python,虽然官方一直推荐我们用launch的方法来运行,不过我个人更加偏好使用 task 来运行。其优点在于更加轻便,且方便选择多种运行方式。
比如这种情况,使用这样的配置可以让我自由选择使用哪个环境来运行、使用什么参数。而使用launch运行还得反复地更改解释器设置(虽然也没麻烦多少,但是我jio的不优雅)。
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Run Tf Python File",
"type": "shell",
"command": "F:\\Enviroment\\Anaconda3\\envs\\tf\\python.exe",
"args": [
"${file}",
"--dir=data_dir"
],
"problemMatcher": []
},
{
"label": "Run Python File",
"type": "shell",
"command": "F:\\Enviroment\\Anaconda3\\python.exe",
"args": [
"${file}",
"--type=1",
"--iter=1000"
],
"problemMatcher": []
}
]
}
配合Run Task快捷键的设置,我可以优雅地切换运行模式。
然而就在前段时间,我发现这种方式居然失效了!!!没错,在几个月前这种直接使用python.exe绝对路径的方式还能运行成功,而现在我只能的得到这么个结果:
现在我发现,要想运行成功,必须得:
- 激活对应的环境
- 使用python.exe运行脚本
卧槽,好丑陋的方式。。。
2. 解决方法
我的解决方案是编写一个脚本,可以指定环境以及各种参数。首先,你需要把这两样东西加入环境变量中:
- Anaconda的目录
- Anaconda/Scripts
如果不考虑参数的问题其实这活很简单,写一个bat脚本如下:
@echo off
call activate
call conda activate %1
python %2
命名为 Run.bat
好了。
使用的时候,运行 Run.bat <envname> <pyfile>
就行了。不过我不想弄得那么简单,一个重要的原因是我希望这个脚本可以支持不定长的命令行参数的使用。
于是这个问题就变成了:怎么把第一个命令行参数和后面几个命令行参数分开。
经过一番研究后,我终于是把这个脚本编出来了:
@echo off
set str=%*
for /f "tokens=1,*" %%i in ("%str%") do (
set envname=%%i
set params=%%j
)
call activate
call conda activate %envname%
python %params%
文件命名为 CondaRunScript.bat
。
3. 使用
为了使用它,我们需要把它加入环境变量,最简单的方法就是直接放到 Anaconda 的目录下好了。
编写 Vscode 的Task:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Run Python File",
"type": "shell",
"command": "CondaRunScript.bat",
"args": [
"tf",
"training.py",
"--iter=10",
"--lambda=0.8"
],
"problemMatcher": []
}
]
}
注意到在 “args” 的列表里,我们可以自行填写参数。第一个必须是环境的名称,第二个是指定的python文件,后面的参数可以根据需要自定义。
然后运行 task 即可。