使用subprocess.Popen传递命令行参数

1 投票
2 回答
12922 浏览
提问于 2025-04-18 16:47

我有一个图形界面(GUI),当我按下一个“处理”按钮时,它会调用一个需要一个命令行参数的Python脚本。所以我用了subprocess.Popen,代码是这样的:

subprocess.Popen(['chbif /home/vnandak/Work/VS30_Cradle/SV000_sv000/cradle_vs30_dkaplus01_fwd_dl140606_fem140704_v00_mod1.bif'],shell=True)

这里的chbif是这个.py脚本的别名

这个方法运行得很好,但现在我想通过使用tkFileDialog模块里的askfilename()函数来选择我想要的文件。我该怎么做呢?

我想过这样做:

def bifcall():
        name13= askopenfilename()
        subprocess.Popen(['chbif', name13],shell=True)

但是如果我这样做,就会报错,提示缺少一个命令行参数,也就是文件名。

2 个回答

1

因为如果你使用shell=True,作为第一个参数你只能用一个字符串。

试着把

subprocess.Popen(['chbif', name13],shell=True)

改成

subprocess.Popen('chbif ' + name13,shell=True)

但是出于安全考虑,不推荐使用shell=True(详细信息请查看https://docs.python.org/2/library/subprocess.html#frequently-used-arguments)。

3

如果你传入 shell=True,那么第一个参数应该是一个字符串,这个字符串会像在命令行中那样被解释。如果你传入 shell=False,那么第一个参数应该是一个列表,这样就可以绕过命令行的解释。

这里有个回答解释得很好,可以看看: https://stackoverflow.com/a/15109975/451201

撰写回答