Python subprocess.run 不工作但显示已完成

Python subprocess.run not working but shows completed

大家好首先感谢投稿的各位!作为 python 自学的新手,你们都为我节省了很多时间。 现在是我的第一个问题。

我正在尝试使用 echo 将值传递给设备,特别是 /dev/hddled#。 我正在尝试使用以下脚本在 Python 中执行此操作,我知道它不是很干净,我仍在学习中。

import sys
import re
import subprocess

disk1 = '[0:0:0:0]'
disk2 = '[1:0:0:0]'
disk3 = '[2:0:0:0]'
disk4 = '[3:0:0:0]'
disk5 = '[4:0:0:0]'
patterns = ['/dev/sda', '/dev/sdb','/dev/sdc','/dev/sdd','/dev/sde']
drives = []


gettingtext = subprocess.check_output(['lsscsi']) 
mytest = subprocess.check_output(['lsscsi']).decode("utf-8")
print(mytest)
print(type(mytest))
lines = mytest.splitlines()

# f = open("lsscsi.txt", "r")
for line in lines: 
    if disk1 in line:
        searchdsk = re.findall(r'\W/.+',line)
        drives.append('1')
        print(str(drives))
    elif disk2 in line:
        searchdsk = re.findall(r'\W/.+', line)
        drives.append('2')
        print(str(drives))
    elif disk3 in line:
        searchdsk = re.findall(r'\W/.+', line)
        drives.append('3')
        print(str(drives))
    elif disk4 in line:
        searchdsk = re.findall(r'\W/.+', line)
        drives.append('4')
        print(str(drives))
    elif disk5 in line:
        searchdsk = re.findall(r'\W/.+', line)
        drives.append('5')
        print(str(drives))
print("These are the drives: " + str(drives))
print(type(drives))
for disknum in drives:
    stuff = subprocess.run(["/usr/bin/echo", "1",  ">", "/dev/hddled" + disknum], shell=True, text=True, capture_output=True)
    stuff
    print("stdout", stuff.stdout)
    print("stderr", stuff.stderr)
    print(type(disknum))
    print("This is number: " + disknum)
    print("This is the command:" + str(stuff))
# f.close()

当我 运行 这段代码时,它似乎工作得很好,我得到了驱动器列表的预期值。 我还收到了返回码 = 0 和标准输出 ='\n' 的已完成流程,这是预期的。

This is the command:CompletedProcess(args=['/usr/bin/echo', '1', '>', '/dev/hddled5'], returncode=0, stdout='\n', stderr='')

但是它似乎没有将值回显给 /dev/device。当 运行 直接在 shell 中使用命令时,它工作得很好。

echo 1 > /dev/hddled1

我不确定下一步该去哪里,因为我 运行 没有东西可以尝试查找。任何人都可以提供的任何帮助将不胜感激。

谢谢

如果使用 shell=True,则必须仅将单个字符串参数作为第一个参数传递给 subprocess.run。当你写:

stuff = subprocess.run(["/usr/bin/echo", "1",  ">", "/dev/hddled" + disknum], shell=True, text=True, capture_output=True)

你其实只是运行/usr/bin/echo。你应该这样写:

stuff = subprocess.run("/usr/bin/echo 1 > /dev/hddled" + disknum, shell=True, text=True, capture_output=True)

尽管我建议使用格式字符串而不是字符串连接(只是因为我认为发生的事情更明显):

stuff = subprocess.run(f"/usr/bin/echo 1 > /dev/hddled{disknum}", shell=True, text=True, capture_output=True)

当然,除了调用 echo,您也可以直接在 Python 中调用。像这样的东西应该是等​​价的:

with open(f"/dev/hddled{disknum}") as fd:
    fd.write('1\n')