2017-11-21 3 views
0

OS 라이브러리를 사용하여 파일 또는 폴더의 존재를 매우 쉽게 확인할 수 있습니다. 다음 두 링크는 ​​ directoryExistancefileExistance파이썬에서 서브 프로세스 라이브러리를 사용하여 파일 또는 폴더의 존재 확인

내가 같은

을 수행 할 서브 프로세스를 라이브러리를 사용하려고 시도하고 있음을 설명하고, 나는

1 이미 접근 방법의 몇 가지를 시도 status = subprocess.call(['test','-e',<path>])은 경로에서 무엇을 전달하더라도 항상 1을 반환합니다. getstatusoutput를 사용

2,

/빈/SH는 : 1 : 권한 상태 변수가 126을 반환하기 때문에 파일/폴더가 존재하는 경우 제대로 작동

status, result = subprocess.getstatusoutput([<path>]) 
print(status) 
print(result) 

127 거부 파일/폴더가 존재하지 않습니다. 또한 결과 변수에 메시지가 있지만 결과 변수에 메시지가 포함되어 있습니다. 사용 권한이 거부되었습니다.

하지만 두 번째 해결책은 나에게 해킹처럼 보입니다. 이 일을하는 것이 더 나은 방법인가요?

+0

"/ bin/sh : 1 : : Permission denied"는 실수로 두 번째 지점에 기록됩니다. –

+0

현대적인 방법은 ['pathlib'] (https://docs.python.org/3/library/pathlib.html#basic-use)를 사용하는 것입니다. –

+0

'~'로 작업하지 않습니다.내 우분투 플랫폼에서 –

답변

0

으로 "참 쉘 ="

status = subprocess.call(['test','-e',<path>]) 

우리가 를 사용하는 경우 쉘 확장 작업을 할 수있는 코멘트 섹션

하는을 os.path를 사용하는 것이 더있을 수도 있지만에서 지적 어쨌든 더 효율적입니다.

1

test 명령은 쉘 내장 명령이며 많은 플랫폼에서 실행할 수있는 독립적 인 명령으로 존재하지 않습니다.

shell=True을 사용하여이 명령을 실행하는 셸을 사용하는 경우 토큰 목록이 아닌 단일 문자열을 전달해야합니다.

status = subprocess.call("test -e '{}'".format(path), shell=True) 

path 어떤 작은 따옴표가 포함되어있는 경우 잘못된 명령을 생성 할 것이다; 완전히 정확하고 견고 할 경우 path.replace("'", r"\'")을 시도하거나 제대로이 전달 명령의 모든 쉘 메타 문자를 탈출 기존 인용 기능 중 하나를 사용하십시오.

subprocess 라이브러리가 이제 약간 덜 다루기하는 기능 run()을 제공합니다 오래된 유산보다 call() 기능; 이전 버전과의 호환성이 중요하지 않은 경우, 아마도이 모드로 전환해야합니다. 또는 여러 의견 작성자가 이미 사용자를 자극 했으므로 이식 할 때이 작업에 subprocess을 사용하지 말고 가벼운 원시 Python 솔루션을 사용할 수 있습니다.

+0

'test -e'는 주어진 이름을 가진 엔트리가 파일 시스템에 존재 하는지를 단순히 확인합니다. 아마 당신은'test -f'와'test -d'를 찾고있을 것입니다. 이것은'test -d'가 정규 파일인지 디렉토리인지를 추가적으로 확인합니다. – tripleee