2017-09-29 3 views
0

서브 프로세스가 처음인데 os.system 대신 subprocess.call을 사용하려고합니다. 이 명령은 os.system을이과 같습니다subprocess.call() 문을 포맷하는 방법은 무엇입니까?

os.system('cluster submit {} gs://{}/{}'.format(cluster_name, bucket, file))

어떻게 그 subprocess로 번역 것인가? 나는 시도 다음 그러나 어느 쪽도 일 :

  1. subprocess.call(["cluster", "submit", "{}", "gs://{}/{}".format(cluster_name, bucket, file)]).strip()

  2. subprocess.call(["cluster", "submit", "{}", "gs://{}/{}".format(cluster_name, bucket_name, script)], shell=True).strip()

+0

"클러스터"란 무엇입니까? 별명 인 경우, BASH가이를 해결할 수 있도록 쉘에 포 K해야합니다. 이 답변보기 : https://stackoverflow.com/questions/89228/calling-an-external-command-in-python/89243#89243 –

+1

@StuartBuckingham, 비대화 형 쉘은 별칭을 지원하지 않습니다. 그들은 bash에서 켜질 수 있지만, 심지어 비대화 형 쉘은'.bashrc' 또는'.bash_profile'을 실행하지 않기 때문에 보이지 않습니다. –

+0

@ PM2Ring, 기본'sh'는 아무 관계가 없습니다. 'shell = True'가 없다면, 어떤 쉘을 실행할지를 결정하는 데 사용되는 shebang 만이며, shebang이없는 스크립트를 실행하는 것은 실패합니다; 커널의'exec' 호출이 실패 할 경우 다른 쉘 인터프리터를 생성하는 대체 동작이있는 경우에만 가능합니다. –

답변

1
subprocess.call([ 
    "cluster", 
    "submit", 
    str(cluster_name), 
    "gs://{}/{}".format(bucket_name, script) 
]) 
1

첫째, the docs for subprocess.call에서 살펴 :

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

args가 설명하는 명령을 실행하십시오. 명령이 완료 될 때까지 기다린 다음 returncode 속성을 리턴하십시오.

이 명령은 subprocess.call(...).strip()을 호출하려는 시도가 실패 할 수 있도록 정수인 프로세스 반환 코드를 반환합니다. 인수

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

실행 명령을하고 바이트 문자열로 출력을 반환 : 명령의 출력을 원하는 경우에, 당신은해야합니다. 당신이했습니다 다음

output = subprocess.call(["cluster", "submit", "{}", 
    "gs://{}/{}".format(cluster_name, bucket, file)]).strip() 

을하지만 당신은 당신이 .format를 호출 하지되는 베어 "{}"를 가지고 있기 때문에 몇 가지 기본적인 파이썬 문제는, 거기에, 그리고 :

이것은 당신에게 줄 것이다 "gs://{}/{}"에는 형식 마커가 두 개 있지만 매개 변수가 세 개 있습니다.

output = subprocess.call(["cluster", "submit", cluster_name, 
    "gs://{}/{}".format(bucket, file)]).strip() 

당신이 두 번째 예에서와 같이 shell=True를 사용

, 당신은 목록이 아닌 문자열을 전달합니다 : 당신은 더 뭔가를 원한다. 예 :

output = subprocess.check_output("cluster submit {} gs://{}/{}".format(
    cluster_name, bucket_name, script), shell=True).strip() 
관련 문제