2016-11-02 5 views
2

私はPythonを初めて使い、何年もLinuxを使用していないので、どこが絡まっているのか分かりません。私はPopenを使用してUbuntuのMySQLでSQLファイルを実行しようとしています。ここでpopenとmysqlに関するPythonの問題

は、関連するコードです:

command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132', '--database=dbName', '<', './1477597236_foo.sql' ] 
print("command is: "+subprocess.list2cmdline(command)) 

proc = subprocess.Popen(
    command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd='.' 
) 

これからの出力は、持っていた実行「のmysql --help」の場合と同じです。私にとって不思議なことは、もし私がsubprocess.list2cmdlineでコマンド出力を取り出してそれを直接実行すれば、それは完全に動作するということです。また、'< file.sql''-e select * from foo'に置き換えると、それが実行されます。したがって、'<'とファイルが原因で問題が発生しています。私は問題の原因を知っていますが、これまでに試したことはありません。

TIA、クレイグ

答えて

4

リダイレクションまたはパイプまたは組み込みコマンドは、コマンドラインに存在する場合、shell=Trueが必要とされます。しかし、このような単純なケースでは、shell=Trueは過剰です。 shell=Trueを避けるためには、入力ファイルをよりよく制御できるように、よりクリーンな方法があります。

  • 入力ファイルが存在しない場合、あなたは
  • プロセスは、シェルなしで実行扱いやすいですサブプロセス、到達前に例外を得る:優れたポータビリティ&パフォーマンスを

コード:

command = ['mysql', '-uUSER', '-pPWD','-h192.168.1.132', '--database=dbName' ] 

with open('./1477597236_foo.sql') as input_file: 
    proc = subprocess.Popen(
     command, stdin = input_file, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 
    output,error = proc.communicate() 

(Iはであるべきである次の行を追加呼び出し:両方の標準出力& stderrがリダイレクトされているので、両方の出力ストリーム間でデッドロックを回避する唯一の簡単な方法です)。

+1

最後に、 'subprocess'を使用しないでください。http://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python – mgilson

+0

典型的な私:大きな画像を見下ろす、低レベルで答える。それでも私の答えは、入力リダイレクションがSQLやその他のコマンドで必要となるケースをカバーしています。いい視点ね。 –

+0

私はいくつかの問題を抱えていましたが、Jean-FrançoisFabreの答えは私を正しい方向に導いてくれました。皆さんありがとう! –

0

つまり、あなたのPopenコールにshell=Trueを追加する必要があります。 <はシェルの一部であり、そのパラメータがないとシェル機能を使用することはできません。

proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, cwd='.',shell=True) 
関連する問題