python 未正确显示可执行输出

python not displaying executable output properly

我正在使用代码通过 Linux 终端中的 python 执行可执行文件。

我在python中使用的代码是

import subprocess


def executable_shell():
    # to run cosmo file     
    x=subprocess.run('cd .. && cd build &&  ./COSMO', shell=True, capture_output=True)
    print(x)

executable_shell()

这里COSMO是我的可执行文件 对于 运行 这个 python 文件,我使用命令:$ python3 file.py

代码有效,但显示文件之间没有行 space,就像每个新行都从同一行开始而不是跳到新行。

但是如果我运行这个可执行文件以正常的方式从终端

$ ./COSMO

我得到了正确的格式。

示例输出:

xxxxx xxxxx xx

期望的输出:

xxxxx
xxxxx
xx

您的代码 运行 将在一行中打印 CompletedProcess 对象的人类可读表示形式,其中包括但远不止是子进程的实际输出。

Python 3.7.2 (default, Mar 25 2020, 10:15:53) 
[Clang 11.0.3 (clang-1103.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> x = subprocess.run(['printf', '%s\n', 'foo', 'bar', 'baz'], capture_output=True)
>>> print(x)
CompletedProcess(args=['printf', '%s\n', 'foo', 'bar', 'baz'], returncode=0, stdout=b'foo\nbar\nbaz\n', stderr=b'')

要实际仅打印输出,请尝试

>>> print(x.stdout.decode())
foo
bar
baz

更好的是,让 Python 为您解码。

import subprocess


def executable_shell():
    # to run cosmo file     
    x = subprocess.run(
        # Just the command, as a list of arguments, so we can avoid shell=True
        ['./COSMO'],
        # Specify which directory to run it in
        cwd='../build',
        # Throw an exception if the command fails (optional but recommended)
        check=True,
        # Have Python decode the output as text instead of raw bytes
        text=True,
        # Capture output, as before
        capture_output=True)
    return x.stdout

print(executable_shell())

请注意我是如何添加 text=True(并且重构为使用 check=True 并删除 shell=True)以及函数现在如何 return 的结果,以及调用者打印它(或者用它做其他事情,视情况而定)。通常,您希望函数返回 return 结果而不是打印它们;这使得将它们重用于其他任务变得更加容易。