命令在终端或程序中提供不同的行为(Python和C )

Command gives different behaviour in terminal or in program (Python and C++)

本文关键字:Python 终端 程序 命令      更新时间:2023-10-16

我试图以编程方式执行以下命令:

~$ obabel -:"ccco" -O /home/user/output.png

obabel是一个化学库,基本上,如果"中的字符串是完全胡说八道的,它将无法生成PNG文件,如果它是合法的化学结构,则PNG文件将生成。这在终端中起作用。

但是,如果我用python调用同一命令,则为完整的废话输入字符串生成png文件,在终端执行命令时不会生成png。

我正在使用这样的子过程:

cmd = 'obabel -:"ccco" -O /home/user/output.png'
proc = sub.Popen([cmd], shell=True, stderr=sub.PIPE)
res = proc.communicate()

我也尝试过:

os.system(cmd)

尝试了Python2和Python3。从终端或ipython运行脚本时,就会发生这种情况。

我还尝试使用C 并这样运行CMD:

std::string cmd = "obabel -:"ccco" -O /home/user/output.png";
system(cmd.c_str());

默认情况下Popen期望字符串参数列表,但是如果通过shell=True,则可以将命令作为简单字符串提供(将在Shell中执行(。当前,您正在将包含整个命令的字符串传递到一个列表中,而是可以使用其中的任何一个:

proc = subprocess.Popen('obabel -:"ccco" -O output.png', shell=True, stderr=subprocess.PIPE)
proc = subprocess.Popen(['obabel', '-:ccco', '-O', 'output.png'], stderr=subprocess.PIPE)

用引号逃脱了微笑字符串似乎是为了保护它免受外壳的侵害,而直接传递输入时,您不需要它(否则"字符将是字符串的一部分并导致无效的语法(。