2017-03-23 23 views
1

Python内で複雑な外部コマンドを実行する方法を知りましたか?Python内で複雑な外部コマンドを実行するには?

これは、Linuxのbashのコマンドラインでうまく機能


$ mysqldumpを--single-トランザクション-u myusernameと指定-pmypassword mydbというmytableは> mytable.sql

しかし、それはPythonのコード内から動作しません。

私のPythonコードには何が問題なのですか?(私は私のpythonコードで何が問題なのですか? ?

または、私はos.system()を使用する必要がありますか?

どうすればPythonコード内で動作するか教えてください。ありがとうございます。

答えて

0

問題は>がプログラムのコマンドライン引数ではないということです。 >は、実際にはシェル出力リダイレクション演算子です。それはシェル自体によって処理され、mysqldumpプログラムでは処理されません。

Pythonのsubprocessはシェルについて何も知らないので、>のようなシェル演算子を理解することはできません。 mysqldumpも引数として、>mytable.sqlmysqldumpを渡そうとしているだけで、エラーが発生します。

実行する必要があるのは、サブプロセスが出力をリダイレクトするように設定することです。 Pythonでそれを行う方法は次のとおりです。

with open('mytable.sql', 'w') as f: 
    subprocess.call(['mysqldump', 
        '--single-transaction', 
        '-u', 
        'myusername', 
        '-pmypasword', 
        'mydb', 
        'mytable'], stdout=f) 

subprocess.callからstdout引数は>シェル演算子と同じように、あなたが好きな場所あなたのサブプロセスの出力を指示することができます。

+0

卿を助けるホープ、心の底からありがとうございました! – adorp

+0

私は助けてうれしい!私の答えが役に立ったら、upvoteして受け入れてください:) –

+0

こんにちはペドロ、私はかなりの回数upvotingを試みたが、いつも失敗、奇妙に終わった!私は間違ったことをしましたか? – adorp

1

それは構文エラーになりそうだ、

subprocess.call(['mysqldump' '--single-transaction' '-u' 'myusername' '-pmypasword' 'mydb' 'mytable' '>' 'mytable.sql']) 

'-u' 'myusername'引用分離がありません。

subprocess.runは、バージョン> = 3.5のsubprocess.callを置き換えます。 Check python subprocess.call API deprecation これはうまくいくはずです。ここで

+0

いいえ、このタイプミスを修正した後でも、まだ動作しません。 – adorp

+0

あなたは正しいですが、動作しません。 Pedroは 'stdout'へのリダイレクトで正しいです。廃止予定の 'subprocess.call'と誤字は依然として適用されます。 – northerntechie

0

は、Python内から複雑な外部コマンドの実行例である:

https://github.com/yokawasa/azure-shell

Azureのシェルは、それが内部的に私たちのサブプロセス

import subprocess 
full_cmd = "external command" 
p = subprocess.Popen(full_cmd, shell=True, env=self._env) 
p.communicate() 

アンiteractive AzureのCLI 2.0コマンドラインインターフェースであります外部コマンドはazコマンド(azure-cli 2.0)です。このコマンドは多くのコマンドオプションとパラメータを持ち、非常に複雑です。したがって、azure-shellは、azure-cliのコマンドオプションとパラメータの自動補完をサポートしているため、azure-cliコマンドリファレンスの確認や 'az -h'の入力時間を節約できます。自動補完機能を達成するために、レバレッジのpythonプロンプトツールキット

https://github.com/jonathanslenders/python-prompt-toolkit

はあなたのソリューションは完全に正確である、それは

+0

私はこの単純な要件のためにもっと複雑なものをインポートしたくないので、os.system()ははるかに簡単で組み込み関数です。とにかくありがとう。 – adorp

関連する問題