在Python中通过subprocess查看shell脚本的输出

13 浏览
0 Comments

在Python中通过subprocess查看shell脚本的输出

我有一个简单的shell文件,内容如下:

#! /bin/bash
echo "Hello"
echo "Full Name: $1";
echo "Age: $2";

我在Python Jupyter Notebook中这样调用该文件:

import subprocess
filePath = 'testScript.sh'
arg1 = 'John Doe'
arg2 = 2
subprocess.run([filePath, arg1, str(arg2)], shell=True, check=True)

文件运行正常,我得到以下输出:

CompletedProcess(args=['testScript.sh', 'John Doe', '2'], returncode=0)

当代码运行时,会弹出一个命令行窗口,输出会在窗口中闪现一秒钟然后关闭。我想知道是否有办法将输出打印到Python中,而不仅仅在命令行窗口中看到输出?或者有没有办法阻止命令行窗口关闭,这样我就可以看到输出?

0
0 Comments

问题的原因是在使用subprocess.run()函数时,虽然使用了capture_output=True参数,但输出的结果是一个二进制字符串b'',而不是预期的正常输出。解决方法是将二进制字符串转换为普通字符串。

解决方法如下:

使用decode()方法将二进制字符串转换为普通字符串。

示例代码如下:

output = subprocess.run(["ls", "-a"], capture_output=True).stdout.decode()

通过调用decode()方法,我们可以将二进制字符串转换为普通字符串,得到正确的输出结果。

0
0 Comments

问题出现的原因是使用subprocess.run()运行shell脚本时,标准输出和标准错误输出并没有直接显示在Python中。解决方法有两种:

1. 将输出写入文件:可以通过将输出重定向到文件来实现。首先创建一个文件对象,然后将其传递给subprocess.run()函数的stdout和stderr参数。如下所示:

import subprocess
import os
subdir = ...  # 脚本所在路径
fout = open(os.path.join(subdir, "out.txt"), "w")  # 打开一个文件用于保存标准输出
ferr = open(os.path.join(subdir, "err.txt"), "w")  # 打开一个文件用于保存标准错误输出
p = subprocess.run(file_to_run, cwd=subdir, stdout=fout, stderr=ferr)

这样会在指定的路径下创建out.txt和err.txt文件,并将shell脚本的标准输出和标准错误输出写入到这两个文件中。

2. 在脚本末尾添加"pause"命令(适用于Windows/DOS批处理文件):在脚本末尾添加"pause"命令可以阻止控制台自动关闭。可以通过在脚本末尾添加以下代码来实现:

pause

这样在脚本执行完毕后,控制台会等待用户按下任意键才关闭。

需要注意的是,第一种方法会将输出保存到文件中,方便后续查看和分析。而第二种方法则是在控制台中直接显示输出,但需要手动关闭控制台。根据具体需求选择合适的方法来查看shell脚本的输出。

0