2017-11-01 27 views
1

그래서 파이썬으로 점점 그리고 난에 스크립트를 쓰고 있어요 : urllib.urlretrieve를 사용Python -이 출력을 보는 이유는 무엇입니까?

  1. 을 다운로드합니다 RPM.
  2. rpm2cpio 및 cpio를 사용하여 파일의 압축을 풉니 다.
  3. 파일과 관련된 작업을 수행하십시오.
  4. shutil.rmtree를 사용하여 정리하십시오.

기능적으로 그것이이 모든 일을합니까 모든 좋은 그러나 나는이 정리 코드에 넣어 이후로는 다음과 같은 출력 받고 있어요 :

#!/usr/bin/python 

from contextlib import contextmanager 
import os, subprocess, shutil 

@contextmanager 
def cd(directory): 
    startingDirectory = os.getcwd() 
    os.chdir(os.path.expanduser(directory)) 
    try: 
     yield 
    finally: 
     os.chdir(startingDirectory) 

# Extract the files from the RPM to the temp directory 
with cd("/tempdir"): 
    rpm2cpio = subprocess.Popen(["rpm2cpio", "MyRPM.rpm"], stdout=subprocess.PIPE) 
    cpio = subprocess.Popen(["cpio", "-idm", "--quiet"], stdin=rpm2cpio.stdout, stdout=None) 

# Do 
# Some 
# Things 
# Involving 
# Shenanigans 

# Remove the temp directory and all it's contents 
shutil.rmtree("/tempdir") 
: 여기

rpm2cpio: MyRPM.rpm: No such file or directory 
cpio: premature end of archive 

코드입니다

여기에 코드의 일부 구문 문제가 있거나 누락 된 가져 오기 또는 기타 사항이있는 경우 실제로 두 메시지가 표시되는 이유와 관련이 있지 않으면 무시하십시오. 나는 스크립트를 관련 비트로 줄이려고했다. 내가 찾고있는 것은 위의 두 메시지가 인쇄되는 이유에 대한 설명입니다. 스크립트가 위에서 아래로 실행되었다고 생각 했겠지만 지금은이 경우에 잘못 생각할 수 있습니다.

편집 : 'rpm2cpio'및 'cpio'명령을 사용하면 스크립트가 명시 적으로 닫아야 할 필요가있는 것처럼 실행되는 동안 아무 것도 열리지 않는 것처럼 느껴질 수 있습니다 ...? 그게 말이 되니? :)

고마워요! 당신은 기본적으로 경쟁 조건 그래서 는 J

+0

1) 루트가 아닌 폴더의 절대 경로입니까? 일반적으로 임시 디렉토리와 파일은/tmp의 _inside_를 만듭니다. 2)이 임시 디렉토리를 만들었습니까? 최소한 당신이 제시 한 것은 그것이 존재하지 않는다는 것을 시사합니다. 3) 임시 디렉토리에'MyRPM.rpm'을 넣지는 않았다. 이 중 하나 또는 모두가 RPM을 찾을 수없는'rpm2cpio '를 설명 할 수 있습니다. – hunteke

+0

@hunteke 1) 절대 경로입니다. 예. 현재 스크립트 옆에 디렉토리를 만들고 거기에 RPM을 넣고 있습니다./tmp 결국 조언을 주셔서 감사합니다 2) 내가 말했듯이 내가 기능적으로 모든 일을하고있다 그래, 나는 임시 디렉토리를 만들고 그것 안에 RPM 파일을 성공적으로 추출 3) 2와 같은, 감사 – Jaymoney

+1

스크립트가 제대로 기다리고 있습니다 'rpm2cpio'와'cpio'가 작업을 끝내고 있습니까? 스크립트가 작업을 수행하기 전에 임시 디렉토리를 제거하면 해당 메시지를 설명합니다. – hunteke

답변

0

subprocess.Popen is non-blocking는 - Popenrmtree로 통화 사이를 이러한 프로세스가 완료 (! 또는 시작) rmtree이 실행되기 전에 수 있다는 보장은 없습니다.

는 내가는 popen 개체

cpio.wait() 
rpm2cpio.wait() 

# Remove the temp directory and all it's contents 
shutil.rmtree("/tempdir") 

당신이 명령을 파이프있는 방법에 당신을위한 옵션처럼 보이지 않는 차단 subprocess.call를 사용하여 반환 할 기다리는 것이 좋습니다.

+0

시간을내어 정보를 보내 주셔서 감사합니다. 또한 시간 문제라고 결론을 내리는 데 도움을 준 @hunteke에게도 감사드립니다. – Jaymoney

+1

또한 추가 정보를 위해 cpio.wait() 자체가 잘 작동하는 것처럼 보입니다. – Jaymoney