2012-12-06 4 views
2

나는 Windows와 Mac OS간에 subprocess.Popen은 어떻게 다릅니 까?

subprocess.Popen(['C:\\python26\\python.exe ','main_plot.py','-n', str(number_of_cores),'-m', str(number_of_motors)]) 

내가 실행하는 맥 OS의 PC에 ssh를 시도한 다음 줄을 사용하여 다른 파이썬 프로그램 'main_plot.py'를 열어 Windows에서 일부 파이썬 코드를 ... 봤네 같은 코드이지만 경로를 변경해야한다고 생각하기 때문에 작동하지 않습니다. 이것은 나의 첫번째 추측 ...

subprocess.Popen(['python','main_plot.py','-n', str(number_of_cores),'-m', str(number_of_motors)]) 

했지만, 난이 오류가 ... 파이썬 : 파일을 열 수 없습니다 'main_plot.py': [errno를 2] 해당 파일이나 디렉토리

나는 또한 시도했다

subprocess.Popen(['python','~/code/stochastic/main_plot.py','-n', str(number_of_cores),'-m', str(number_of_motors)]) 

그러나 나는 같은 오류를 얻는다.

파일이 '~/code/stochastic'에 있는지 확인했습니다. 나는 다음에해야 할 일로 조금 붙어있다.

+2

경로를 완전히 확장 해 보셨습니까? 'Popen'은'shell = True'를 사용하지 않는 한'~'와 같은 쉘 단축키를 확장하지 않습니다 (이 경우 쉘이 명령을 구문 분석하여 처리합니다). –

답변

3

문제는 Windows와 Mac의 차이가 아니다. Mac에서는 ~ 만 사용하고 있기 때문에 경로 이름에 ~을 사용할 수 없습니다.

~/code/stochastic/main_plot.py은 실제 경로가 아니며 홈 디렉토리가 아닌 현재 디렉토리 아래 ~ 디렉토리를 찾고 있습니다. 셸은 물결 모양 확장을 사용하여 실제 경로 이름으로 변환합니다. 파이썬은 물결표 확장도 할 수 있지만 명시 적으로 그렇게하도록 요청해야합니다.

그래서, 해결책은 간단하다 :

제레미 로마 코멘트에서 지적 하듯이
subprocess.Popen(['python', 
        os.path.expanduser('~/code/stochastic/main_plot.py'), 
        '-n', str(number_of_cores),'-m', str(number_of_motors)]) 

다음 파이썬 함께 당신의 인수를 모두 넣어 때문에, 당신은 당신이, shell=True을 경로의 사용 ~를 사용하는 경우 쉘에 전달할 명령 행에 넣고 을 처리하고 ~을 처리합니다. 그러나 당신은 그것을하고 싶지 않습니다. expanduser으로 전화하십시오.

향후 참조를 위해 쉘이 수행하는 다른 모든 종류의 확장에 대해서도 마찬가지입니다. "${HOME}/foo"을 할 수는 없지만 os.path.expandvars("${HOME}/foo")을 할 수 있습니다. 너는 할 수 없어 "foo$((1+1))bar"; "foo%sbar" % (1+1,)과 같은 것을해야합니다. 등등.

관련 문제