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

2024-05-15 17:41:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

~$ 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());

Tags: 文件字符串命令cmd终端homeoutputpng
1条回答
网友
1楼 · 发布于 2024-05-15 17:41:41

默认情况下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的影响,直接传递输入时不需要它(否则"字符将成为字符串的一部分,并导致无效语法)。你知道吗

相关问题 更多 >