2012-03-11 2 views
0

최근에 내 Windows OS와 함께 실행되도록 Ubuntu를 설치했습니다. 나는 우분투에서 어떤 스크립트가 어떻게 돌아가는지를보고 싶었고, 대부분의 경우 잘 돌아갔다. 문제를 일으키는 내 코드의 한 부분이 있습니다. os.system ('gnome-open'+ filePath) 명령을 사용하여 파일을 열려고 시도하지만 파일 이름을 지정하지 않으면 파일을 열 수 없습니다 (예 : "data" .txt "파일/디렉토리가 존재하지 않는다고 말하기 때문에"home/user/workspace/project/src/data.txt "라고 말할 수 없습니다. 또한 테스트 목적으로이 파일의 사본을 여러 개 만들었는데 그 중 일부는 이름에 괄호가 있습니다.이 파일을 열려고하면 "sh : 구문 오류 :"("예기치 않게"오류가 발생하고 .. 코드의 라인은 그래서 다음은 내가 참조하고있어 코드가 그것이 내가이 함수를 호출 할 때 액세스 것 라인의Python의 Linux에서 전체 경로 이름을 가진 파일을 열 수 없습니다.

def openFileOfItem(self, row): 
     print fileList[row] 
     if platform.system() == "Windows": 
      os.startfile(fileList[row]) 
     else: 
      if platform.system() == "Linux": 
       os.system('gnome-open ' + nameList[row]) 
      else: 
       os.system('open %s' % fileList[row]) 

가정 그리고 일부 샘플 출력 :

/home/damian/workspace/Kde Gen/src/data.txt 
Error showing url: Error stating file '/home/damian/workspace/Kde': No such file or directory 
/home/damian/workspace/Kde Gen/src/data (copy).txt 
sh: Syntax error: "(" unexpected 
+1

이것을 확인하십시오. 공백을 벗어날 필요가 있습니다. http://stackoverflow.com/questions/35817/how-to-escape-os-system-calls-in-python – jmort253

답변

2

을 (os.P_WAIT, "그놈 오픈", [ "그놈 오픈", 이름 목록은 [행]]) 경로에 공백이 있어야합니다. 논증을 인용하는 대신에 다음을 수행하는 것이 더 깔끔합니다.

import subprocess 
subprocess.call([ "gnome-open", nameList[row] ]) 
+0

당신은 그 논쟁을 목록에 넣는 것을 잊어 버린 것 같습니다. 적어도 그것이 작동하도록해야했습니다. 어쨌든 고마워, 내가 하위 프로세스에 대한 워드 프로세서 보였고 다른 옵션에 대한 의도 된 대체 것 같다. – DamianJ

+0

죄송합니다. 사실 나는 그랬다. 이제 해결되었습니다. – alexis

0

AFAICT, 오류 메시지 경로에 공백이 있기 때문에 경로가 문제를 해결해야합니다.

os.system('gnome-open "%s"' % nameList[row]) 
3

이스케이프 처리없이 문자열을 명령 줄에 직접 덤프합니다. 쉘이 제공 한 명령을 실행하려고하면 오류가 발생합니다. 먼저 파일 경로를 벗어나야합니다. 파이썬 2.7을 사용하고 있기 때문에, pipes.quote

from pipes import quote 

def openFileOfItem(self, row): 
    print fileList[row] 
    if platform.system() == "Windows": 
     os.startfile(fileList[row]) 
    else: 
     if platform.system() == "Linux": 
      os.system('gnome-open %s' % quote(nameList[row])) 
     else: 
      os.system('open %s' % quote(fileList[row])) 
+1

지난 번 확인한 결과, pipes.quote가 완벽하지는 않지만 그냥 큰 따옴표를 넣는 것보다 낫습니다 (다른 답변 에서처럼). 파이썬에 적절한 인용자가 올 때까지 수행됩니다. :-) – torek

0

I can't say "home/user/workspace/project/src/data.txt" because it'll say the file/directory doesn't exist)

는 "/home/user/workspace/project/src/data.txt"을하셨습니까 사용해보십시오? 그렇지 않으면 현재 디렉토리와 관련됩니다.

그 외에도 UNIX에서는 프로그램을 직접 실행하고 인수 벡터를 전달하는 버전을 사용하는 것이 일반적입니다. 그렇지 않으면 system()이 사용하는 쉘이 의도하지 않은 이상한 것을 할 수 있습니다. 주사라고합니다).

os.spawnvp 당신은 효과적으로 쉘 명령을 실행하고, 그것이 의해 넘어 점점

관련 문제