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

标签 python c++ shell subprocess system

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

~$ 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,您可以将命令作为一个简单的字符串提供(它将在如 hell )。目前,您传递的是一个列表,其中包含一个包含整个命令的字符串,您可以使用以下任一方法:

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 的影响,直接传递输入时不需要它(否则 " 字符将成为字符串并导致语法无效)。

关于python - 命令在终端或程序(Python 和 C++)中给出不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48640209/

相关文章:

C++ REG_SZ 到 char* 并在没有提升权限的情况下读取 HKLM

linux - 将所有内容移动到新的子文件夹

python - OCR 的 tensorflow 模型

python - 多个插入语句失败 postgresql/psycopg2

python - Python3 'subprocess.check_output' 中的“cleartool find -print”返回空字符串

c++ - 解释这个 C++ 函数如何返回一个数组

python - 从数据帧中删除存储在变量中的系列

c++ - 如何从 Visual Studio IntelliSense 提示中隐藏私有(private)重载函数?

bash - 如何将 grep 的值分配给变量并与字符串连接?

python - 在 Python shell 中执行带有参数的文件