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

时间:2018-02-06 10:00:05

标签: python c++ shell subprocess system

我正在尝试以编程方式执行以下命令:

application:willContinueUserActivityWithType:

obabel是一个化学库,基本上如果""它是完全无意义的化学,它不能生成PNG文件,如果它是一个合法的化学结构,将生成PNG文件。这适用于终端。

但是,如果我用Python调用相同的命令,则会为完整的无意义输入字符串生成PNG文件,这些字符串在终端中执行命令时不会生成PNG。

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

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

我也试过这个:

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

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

我也尝试过使用C ++并像这样运行cmd:

os.system(cmd)

1 个答案:

答案 0 :(得分:2)

默认情况下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)

使用引号转义SMILES字符串似乎是为了保护它免受shell的影响,并且在直接传递输入时不需要它(否则"字符将成为字符串的一部分并导致语法无效。)