2013-10-30 98 views
1

我嘗試安裝過程中setup.py調用一個Python腳本,使用自定義安裝:爲什麼從setup.py調用Python腳本調用Python shell?

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)) 

當Ubuntu的機器,工藝上部署,而不是執行deploy_database.py包,說明不了什麼。當我用Ctrl + C手動停止,輸出似乎表明,而不是實際運行deploy_database.py,它只是簡單的Python:

^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 

有什麼錯我叫Python腳本的方式嗎?我應該怎麼做呢?

+0

或者你可以使用'execfile'。 –

+0

'shell = True' *應該*暗示您*需要*一個*不能被表達爲一個簡單的字符串序列的特性,即當使用'shell = True'時,您必須使用一個表示整個字符串的字符串* shell命令*(不*僅僅調用外部程序,但包含一些shell特性,如管道/重定向/調用內置等)。否則,你應該使用'shell = False',你可以用'sys.argv'的相同格式來表示要執行的程序和它的參數。混合這兩種方法會導致這種奇怪的結果。 – Bakuriu

回答

1

shell=True[sys.executable, 'demo_package/deploy_database.py']不需要,並導致問題。你這樣做的方式(如果你省略shell=True)是首選方式,因爲它繞過了shell。

shell=True使Popen將傳遞的命令移交給shell(例如/bin/bash,取決於爲當前用戶配置的shell)。

在Unix與殼=真[...]如果ARGS是:只有在執行列表中的傳遞的第一命令,該列表的其它元素被作爲參數傳遞給殼本身(從docs)傳遞序列中,第一項指定命令字符串,任何其他項目將被視爲shell本身的附加參數。

shell=True有點危險,但在某些情況下也有用。詳情請參閱the documentation