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')
大家好首先感谢投稿的各位!作为 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')