1

カスタム インストールを使用して、インストール中に setup.py から Python スクリプトを呼び出そうとしました。

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 スクリプトを呼び出す方法の何が問題になっていますか? 代わりにどうすればいいですか?

4

1 に答える 1

1

shell=Trueでは不要で[sys.executable, 'demo_package/deploy_database.py']あり、問​​題が発生します。shell=Trueシェルをバイパスするため、実行している方法 (を省略した場合) が推奨される方法です。

shell=TruePopen が渡されたコマンドをシェルに渡すようにします (たとえば/bin/bash、現在のユーザー用に構成されたシェルに応じて)。リストに渡された最初のコマンドのみが実行され、リストの他の要素は引数としてシェル自体に渡されます ( docsから):

Unix で shell=True […] args がシーケンスの場合、最初の項目はコマンド文字列を指定し、追加の項目はシェル自体への追加の引数として扱われます。

shell=True少し危険ですが、場合によっては便利です。詳細については、ドキュメントを参照してください。

于 2013-10-30T19:13:39.603 に答える