나는 7zip
그것을 호출하려는 코드에서 진행 상황을 숨기는 몇 가지 문제가 있음을 이해 합니다 (이유는 확실하지 않음).
나는 보았다 여기 있다는 -bsp1
플래그가 파이썬의 숨겨진 진행하지만, 여전히 아무것도 표시해야합니다 :
from subprocess import Popen, PIPE
from time import sleep
cmd = Popen('7z.exe e D:\stuff.rar -od:\stuff -aoa -bsp1'.split(), stdout=PIPE, stderr=PIPE)
while cmd.poll() !=0: # Not sure this helps anything
out = cmd.stdout.read()
print(out)
sleep(1)
명령 줄에서 7z 명령을 실행하면 압축을 풀 때까지 좋은 비율을 얻을 수 있습니다.
Python에서는 7z의 전주곡 출력 (경로, 유형 등)이 표시되고 그 b''
후Ctrl-c
7z는 내가 "실제"터미널에서 호출하지 않는다는 것을 어떻게 알 수 있습니까? 어떻게 든 내가 사용하고있는 것처럼 보이게 할 수 있습니까 ctypes
? Windows 커널 호출 / API를 사용 하고 있습니까?
이와 관련하여 언급 된 "의사 터미널"이라는 용어를 보았지만 관련성이 있는지 잘 모르겠습니다. 그렇다면 Windows의 ConPTY API가 숨겨져 있습니다.
사용할 필요가 없습니다 pseudo-terminal
. 나는 Windows 10에서 일하고 있습니다.
출력을 얻는 것은 쉬울 수 있지만 stdout.readline()
직접 사용하면 즉시 진행 상황을 파악하기 어렵습니다 . (포함되어 \r
있고 줄의 시작 부분에 커서를 놓고 7zip
공백을 사용하여 채 웁니다.) 그러나 구분자로 readline()
사용 합니다. \r\n
.
내 예에서는 stdout.read(1)
출력을 직접 가져 오는 데 사용 합니다. 진행률 라인이 12이므로 숫자를 사용하여 확인합니다.
import subprocess
s = "D:/7-Zip/7z.exe e E:/work/Compile/python/python_project/temp/test.zip -oE:/work/Compile/python/python_project/temp/test -aoa -bsp1"
p = subprocess.Popen(s.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
i = 0
while True:
line = p.stdout.readline()
if line:
if i == 11:
s = b""
while True:
char = p.stdout.read(1)
if char == b"E": # "Everything is ok" means end
break
s += char
if char == b"%":
print(s.decode("gbk"))
s = b""
print(line.decode("gbk"))
i += 1
개선 할 수 있습니다.
end
내 코드에서. 의 조건은 if char == b"E"
.I do n't think it is good. 또한 .decode("gbk")
각 인쇄 줄에서 를 제거 하면 파일 이름과 번호가 다음과 같이 표시됩니다.
문자 분할은 cmd와 다르지만 (일반적으로 x% xx - filename
) 따라서 한 줄 지연이 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다