2013-10-30 4 views
1

나는 사용자 정의 설치를 사용하여 설치하는 동안 setup.py에서 파이썬 스크립트를 호출하려고 :왜 setup.py에서 파이썬 스크립트를 호출하면 파이썬 쉘이 호출됩니까?

class CustomInstall(install): 
    def run(self): 
     install.run(self) 

     ... 

     p = subprocess.Popen(
      [sys.executable, 'demo_package/deploy_database.py'], 
      shell=True, 
      stdout=subprocess.PIPE, 
      cwd=os.path.join(self.install_lib, 'demo_package')) 

     out, err = p.communicate() 

setup(..., cmdclass=dict(install=CustomInstall)) 

대신 deploy_database.py을 실행, 우분투 기계, 과정에 패키지를 배포, 아무것도 표시되지 않습니다.

^CDownloading/unpacking PypiPackagesMonitoring 
    Downloading demo-1.0.64.zip 
    Running setup.py egg_info for package demo 

Installing collected packages: demo 
    Running setup.py install for demo 

    Python 3.3.2+ (default, Oct 9 2013, 14:50:09) 
    [GCC 4.8.1 on linux 
    Type "help", "copyright", "credits" or "license" for more information. 
Cleaning up... 
Operation cancelled by the user 
Storing complete log in /home/.../.pip/pip.log 

내가 파이썬 스크립트를 호출하는 방식에 어떤 문제가 : 나는 Ctrl + C로 수동으로 중지 할 때, 출력이 그를 나타내는 것 대신에 실제로 deploy_database.py를 실행, 단순히 파이썬 시작? 대신 어떻게해야합니까?

+0

아니면 아마도'execfile'을 사용할 수 있습니다. –

+0

'shell = True' * 단순한 문자열 시퀀스로 표현할 수없는 기능이 필요하다는 것을 의미해야합니다. 즉,'shell = True'를 사용할 때 전체를 나타내는 단일 문자열을 사용해야합니다 * 쉘 명령 * (외부 프로그램을 호출하는 것이 아니라 파이프/리다이렉션/내장 함수 호출과 같은 일부 쉘 기능 포함). 그렇지 않으면'shell = False'를 사용해야하고'sys.argv '와 같은 형식으로 실행할 프로그램과 그 인수를 나타낼 수 있습니다. 두 가지 방법을 혼합하면이 이상한 결과가 발생합니다. – Bakuriu

답변

1

shell=True[sys.executable, 'demo_package/deploy_database.py']과 함께 필요하지 않으므로 문제가 발생합니다. 쉘을 우회하기 때문에 당신이하는 방법 (shell=True 생략)은 선호되는 방법입니다.

shell=True은 전달 된 명령을 쉘로 넘깁니다 (예 : /bin/bash, 현재 사용자 용으로 구성된 쉘에 따라 다름). 쉘 유닉스에서

= TRUE [...] 인수 인 경우 : 목록 만 전달 처음 명령 실행,리스트의 다른 요소합니다 (docs)에서 쉘 자체 인수로 전달 첫 번째 항목은 명령 문자열을 지정하고 추가 항목은 셸 자체에 대한 추가 인수로 처리됩니다.

shell=True은 약간 위험하지만 어떤 경우에는 유용합니다. 자세한 내용은 the documentation을 참조하십시오.