2014-05-19 1 views
0

을 제공합니다. 즉, PC에서 실행하면 모든 것이 정상입니다 (ls -l은 3 개의 dir : a, b 및 c를 제공합니다). 하지만 동료가 데스크톱에서 실행하면 {{a, b, c} '라는 하나의 dir이 생깁니다 ... 둘 다 Python 2.7.3을 사용합니다. 왜 그런가요? 어떻게 고칠 수 있니?subprocess.Popen 내가 코드의 간단한 조각을 썼다 임의 결과를

나는 혼자 답변을 찾으려고 노력했다. manual에 따라 : "args는 프로그램 인수의 시퀀스이거나 다른 단일 문자열이어야합니다. 기본적으로 args가 시퀀스 인 경우 args의 첫 번째 항목이 실행될 프로그램입니다. args가 문자열이면 해석은 플랫폼에 따라 다릅니다. 아래에 설명되어 있습니다. 기본 동작과 다른 점에 대해서는 셸 및 실행 인수를 참조하십시오. 달리 명시되지 않는 한 args를 시퀀스로 전달하는 것이 좋습니다. "

은 그래서 쉘 코드를 실행하려고 :

python -c "import subprocess; p=subprocess.Popen(['mkdir', '-p', './{ea,fa,ga}'], shell=True, stderr=subprocess.STDOUT); p.wait()" 

그리고 내가 가지고 :

mkdir: missing operand 

내가 어떤 조언

감사를위한 감사합니다!

+2

귀하와 귀하의 동료는 어떤 운영 체제를 실행하고 있습니까? 두 경우 모두 리눅스, 당신은 어떤 쉘을 사용하고 있습니까? –

+0

다른 쉘은 다른 결과를 줄 수 있습니다. – dilbert

+0

중복 http://stackoverflow.com/questions/16029871/how-to-run-os-mkdir-with-p-option-in-python – endragor

답변

-1

os.mkdir (path, [mode]) 메소드는 멀티 플랫폼 프로젝트에서 작업 할 때 안전하게 사용하는 것으로 알고 있습니다.

os.mkdir(os.getcwd()/a) 

그러나 서브 프로세스 접근 방식만큼 우아하지는 않습니다.

+0

코드가 작동하지 않습니다. 따옴표를 사용해야합니다 :'os.getcwd() + "/ a"'. 이것은 또한 특정 OP의 질문에 대답하지 않습니다. – Darkhogg

2

./{a,b,c} 구문은 모든 쉘에서 지원되지 않는 bash 구문입니다. /bin/sh 셸 기본값은 shell=True와 유닉스에

:

문서는 말한다. args가 문자열이면 문자열은 셸을 통해 실행할 명령을 지정합니다. /bin/shbash 또는 zsh 같은 그 구문을 지원하는 쉘에 심볼릭 링크되어있는 경우

그래서 명령에만 작동합니다. 동료가 dash 또는이를 지원하지 않는 다른 셸을 사용하고있을 가능성이 큽니다.

사용자의 기본 셸과 같은 것을 사용해서는 안됩니다. 대신, 전체 확장에 전체 명령을 쓰기 : 여기에 몇 가지 문제가있다

p = subprocess.Popen('mkdir -p ./a ./b ./c', shell=True, stderr=subprocess.STDOUT) 
0

.

  • 첫째 :.. 당신이 인수의 순서를 사용하는 경우, 설정하지 마십시오 "쉘 = True"로 (this is recommended in the Popen manual)를 false로 설정하고 당신이 당신의 mkdir 명령이 허용됩니다 것을 볼 수 있습니다
  • 을 " ./ {a,b,c} "는 AFAIK에서 bash의 특정 구문입니다. 동료가 다른 쉘을 사용하는 경우, 작동하지 않거나 다르게 작동합니다.
  • 셸 명령을 호출하는 대신 python "mkdir"명령을 사용해야합니다.이 명령은 서버/셸/OS가 무엇이든 작동합니다.
0

답장을 보내 주셔서 감사합니다. 가장 좋은 방법은/bin/sh 구문을 사용하는 것입니다. 내 코드를 다음과 같이 변경했습니다.

'mkdir -p ./a ./b ./c' 

제안 사항을 변경했습니다.

시스템 호출을 많이하는 스크립트를 작성했기 때문에 mkdir() 함수를 사용하지 않았으며 모든 명령을 나열 할 수 있도록 우아한 - 실행 실행 옵션을 제공하려고했습니다.

문제가 해결되었습니다. - 감사합니다.

관련 문제