2

subprocessPython とそのモジュールを使用して、Linux からいくつかの Mysql コマンドを実行したいと考えています。

Python なしで、シェルから、私のコマンドラインは次のとおりです。

mysql --database=mydb --host=localhost --port=3306 --password=  --execute="select * from mytable" --batch

Python では、次のものがあります。

cmd = ['mysql']
cmd.extend(['--database=', self._database])
cmd.extend(['--password=', self._password])
cmd.extend(['--execute=', query])

(...)

p = subprocess.Popen(cmd, shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, err = p.communicate()
errcode = p.returncode

残念ながら、それは機能しません (mysql は使用法を出力するだけです) ' '.join(cmd)

mysql --database= mydb --host= localhost --port= 3306 --password=  --execute= "select * from mytable" --batch

すなわち。と値を区切って、各パラメーターの間にスペースが追加され=ます。

=すべてのパラメーター ( )を削除するcmd.extend(['--password', self._password])と、パラメーターが無効な場合を除いて正常に動作します (そのため、各パラメーターが無効かどうかをテストし、必要に応じて削除します)。

最後に、void パラメーターをテストすることで回避策を見つけましたが、今後の参考のために、この種の処理方法がわからないサブプロセスのヒントや使用法はありparameter=ますか? 使用=しなければならないアプリケーションがあるに違いありませんShell=True

4

2 に答える 2

6

それをに変更します

cmd = [
    'mysql',
    '--database=%s' % self._database,
    '--password=%s' % self._password,
    '--execute=%s' % query
]

(...)

p = subprocess.Popen(cmd, shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, err = p.communicate()
errcode = p.returncode

引数のリストにそれぞれの引数を持つスイッチが含まれるように

于 2013-03-21T17:38:22.520 に答える
1

=符号を含む各引数を 2 つの個別の引数として渡します。それらは2つの別々の引数ではないため、そうしないでください。

cmd.append('--database=' + self._database)
cmd.append('--password='+ self._password)
cmd.append('--execute=' + query)

(繰り返しや呼び出しでは[]なく、リスト全体を一度に定義するために使用する David の提案は、より良いスタイルです。)appendextend

于 2013-03-21T17:40:00.973 に答える