2011-10-07 1 views
38

다른 과학 프로그램을 실행하는 데 사용되는 os.system()을 호출하는 Python 스크립트를 포함한 과학 소프트웨어를 사용하고 있습니다. 서브 프로세스가 실행되는 동안, 파이썬은 어떤 점 인쇄에서 다음os.system() 중에 "IOError : [Errno 9] Bad File Descriptor"로 이어질 수있는 것은 무엇입니까?

close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

나는이 메시지가 os.system() 반환과 동시에 인쇄되어 있다고 생각합니다.

내 질문은 지금 :

어떤 조건 IO 오류의 유형으로 이어질 수 있습니까? 정확히 무엇을 의미합니까? os.system()에 의해 호출 된 서브 프로세스의 의미는 무엇입니까? 파이썬 파일이 "외부"에서 닫힌 경우

+2

참고 :'subprocess' 모듈을 사용하여 [바람직하다] (HTTP ://docs.python.org/library/os.html#os.system)을'os.system()'에 추가합니다. –

+0

:-) 나는 그것을 알고 있으며,이 소프트웨어에는 완벽하지 않은 것들이 많이있다. –

답변

35

당신은 파일이 아닌 객체의 close() 방법에서 즉,이 오류 메시지가 :

>>> f = open(".bashrc") 
>>> os.close(f.fileno()) 
>>> del f 
close failed in file object destructor: 
IOError: [Errno 9] Bad file descriptor 

라인 del f이 원인이되는 파일 개체에 대한 마지막 참조를 삭제 소멸자 file.__del__이 호출됩니다. 파일 개체의 내부 상태는 f.close()이 호출되지 않았기 때문에 파일이 아직 열려 있음을 나타내므로 소멸자가 파일을 닫으려고합니다. 운영 체제가 열려 있지 않은 파일을 닫으려고 시도하여 오류가 발생합니다.

os.system()을 구현해도 파이썬 파일 개체가 생성되지 않으므로 system() 호출이 오류의 원인 일 가능성이 낮습니다. 좀 더 많은 코드를 보여줄 수 있습니까?

+0

감사합니다. 나는 이미이 의혹을 가지고있었습니다. 이 파이썬 스크립트는 꽤 크고, 잘 구조화되어 있지 않고, 잘 쓰여져 있지 않기 때문에 더 많은 코드를 보여줄 수는 없습니다. 나는 지금까지 아주 좋은 개관이 없다. 귀하의 정보를 통해 나는 먼저 이슈를 스스로 찾으려고 노력할 것입니다. –

+0

또 하나의 질문 : 당신의 예제에서, 당신은'f.close()'대신'del f'를 사용했는데 이것은 추적을 초래했을 것입니다. 'del f'는 파이썬의 가비지 수집 중에 어떤 일이 발생합니까? –

+0

내 첫 번째 추측은 MPI 병렬화를 사용하는 스크립트와 관련이 있다는 것입니다. 즉, 서로 다른 프로세스간에 파일 설명자를 공유합니다. –

10

파일을 열 때 잘못된 모드를 사용하면이 오류가 발생할 수 있습니다. 예를 들어 :

with open(output, 'wb') as output_file: 
     print output_file.read() 

그 코드에서, 내가 파일을 읽을 수 있지만 모드 wb 대신 r를 사용하거나 r+

관련 문제