2014-05-08 2 views
0

나는 사용자가 Sox를 사용하여 함께 선택한 오디오 파일을 추가하는 프로그램을 만들고 있습니다.Windows 디렉터리 추가 Python

저는 원래 리눅스 용 프로그램을 만들었지 만 Windows와 호환되도록 만들고 있습니다. Windows에서 파일 목록을 Sox에 전달하면 프로그램에서 '파일 이름, 디렉토리 이름 또는 볼륨 레이블 구문이 잘못되었습니다.'라는 메시지가 나타납니다.

파일 목록을 인쇄 할 때 C:\\\MyProgram\\\ 등등입니다. 경로의 '\\''\'으로 만드는 방법은 무엇입니까?

저는 Windows 8.1에서 문제가 될 수 있습니다.

나는 시도했다 :

str(nameoffile) 

os.path.abspath(nameoffile) 

os.path.normpath(nameoffile) 

파일 및 디렉토리의 거대한 목록이있다, 그래서 각각의 절대 파일을 설정하는 것입니다하지 옵션, 나는 할 수 있도록) (os.path.join 사용하고 사용자가 폴더를 탐색 할 수 있습니다.

그러나 파일을 목록에 전달한 다음 subprocess.list2cmdline(mylist)을 사용하여 목록을 호출하면 단순히 위의 오류가 발생합니다.

예 : os.path.join이 파일을 추가 할 때

mydirectory = os.getcwd() 

appendlist = list() 

appendlist.append("sox") 

for x, i in enumerate(self.fileselected): # A List Of Files The User Selected 

    directory = chosendirectory 

    nextfile = os.path.join(chosendirectory, i) 

    appendlist.append(nextfile) 

subprocess.call([subprocess.list2cmdline(appendlist)], shell=True) 

.... 그것은 "C:\\\Program\\\file"를 생성 한 후이 str()로 변환됩니다. str()은 "C:\\\Program\\\file"이고 이스케이프 문자는 문자열에 등록되지 않습니다. 이스케이프 문자를 제거하여 유효한 Windows 디렉토리로 목록에 전달하려면 어떻게합니까?

+0

[this] (http : //www.diveintopython.net/file_handling/os_module.html) 자습서가 도움이 될 것입니다. ''\''는 시간의 역사상 거의 모든 언어의 문자열에 대한 이스케이프 문자이기 때문에 Windows에서의 경로 작업은 PITA입니다. TL, DR, 문자열 리터럴에서 경로 구분 기호는 항상 문자열에서 정규''r '\' "'을 얻는 방법이기 때문에 항상''\\ '''이 될 것입니다. – aruisdante

+0

그것은 도움이되었지만 어떤 이유에서든 서브 프로세스는 '\\'을 좋아하지 않는다. 반복 할 때조차도 여전히 오류를 발생시킨다. 문자열이나리스트에서 '\'을 '\'으로 만들려면 os 모듈이나 다른 곳에 메소드가 내장되어 있습니까? – caleb

+0

[this] (http://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-in-windows-filenames/)를 확인하십시오. 내 생각에''os.path.normpath (os.path.abspath (nameoffile))''를 실행하면 작업이 완료됩니다. – aruisdante

답변

0

는 서브 프로세스의 현재 작업 디렉토리를 변경하는 경우 전화를 단순화 할 수 있습니다 :

from subprocess import check_call 

check_call(['sox'] + self.fileselected, cwd=chosendirectory) 

참고 : start과 같은 명령을 내부 (쉘 내장)를 실행하려는 경우가 아니면 shell=True 필요하지 않습니다 .


백 슬래시는 소스 코드에서 파이썬 문자열 리터럴 내부에 특별한 의미가 있습니다. 당신이 파일의 경로를 읽으면 -

>>> len('\\') == 1 # a single backslash inside the string 
True 

백 슬래시 (메모리) 문자열 객체의 특별한 의미 수동으로 파이썬 소스 코드의 경로를 작성하지 않는 즉, 당신은 백 슬래시에 대해 신경 안가 없습니다 ; 당신은 그들을 탈출 할 필요가 없습니다. GUI에서 경로를 읽는 경우; 당신은 그들을 탈출 할 필요가 없습니다. 하위 프로세스의 출력에서 ​​경로를 읽는 경우; 당신은 그 (것)들을 도주 할 필요가없는 다.

repr(path)를 인쇄하는 경우에; 파이썬 문자열 리터럴이 어떻게 보이는지, 즉 백 슬래시가 두 배로 (이스케이프 된) 어떻게 보이는지 보여줍니다. 인쇄 할 경우 [path]'['+repr(path)+']'과 같습니다. print(path)에 따라 문자열을 인쇄하면 문자열 개체에 repr이 호출되지 않으며 백 슬래시가 두 배로 표시되지 않습니다.

Windows 경로 및 정규식 패턴의 경우 백 슬래시가 이스케이프 처리되지 않은 원시 문자열 리터럴을 사용할 수 있습니다 (예 : r'C:\Path\n\f' == 'C:\\Path\\n\\f') (예 : 접두어).

관련 문제