7

Python(2.7.2)を介していくつかのAndroidADBシェルコマンドを自動化するラッパーを作成しています。場合によっては、コマンドを非同期で実行する必要があるため、サブプロセス.Popenメソッドを使用してシェルコマンドを発行しています。

[command, args]メソッドのパラメーターのフォーマットに問題が発生しましたPopen。WindowsとLinuxではコマンド/引数の分割が異なります。

# sample command with parameters
cmd = 'adb -s <serialnumber> shell ls /system'

# Windows:
s = subprocess.Popen(cmd.split(), shell=False) # command is split into args by spaces

# Linux:
s = subprocess.Popen([cmd], shell=False) # command is a list of length 1 containing whole command as single string

posixフラグを使用して、または使用せずに、 shlex .split()を使用してみました。

# Windows
posix = False
print shlex.split(cmd, posix = posix), posix
# Linux
posix = True
print shlex.split(cmd, posix = posix), posix

どちらの場合も同じ分割を返します。

OS固有のフォーマットを正しく処理する方法はありますsubprocessか?shlex

これが私の現在の解決策です:

import os
import tempfile
import subprocess
import shlex

# determine OS type
posix = False
if os.name == 'posix':
    posix = True

cmd = 'adb -s <serialnumber> shell ls /system'
if posix: # posix case, single command string including arguments
    args = [cmd]
else: # windows case, split arguments by spaces
    args = shlex.split(cmd)

# capture output to a temp file
o = tempfile.TemporaryFile()
s = subprocess.Popen(args, shell=False, stdout=o, stderr=o)
s.communicate()
o.seek(0)
o.read()
o.close()

shlex.split()ここでは何もしていないと思いますが、cmd.split()同じ結果が得られます。

4

2 に答える 2

5

shell=True引数は、コマンドラインをシェルで評価するように指示します。これは、Windowsでは;Cmd.exeになります。Linuxでは、そうなる可能性がありますが/bin/bash、他の関連するシェル(zsh、tcshなど)である可能性もあります。動作の違いは、シェルがコマンドを異なる方法で解釈することが原因である可能性があります。

回避できるのであれば、使用しないことを強くお勧めします。shell=Trueちょうどこのようなもの:

cmd = 'adb -s <serialnumber> shell ls /system'
s = subprocess.Popen(cmd.split())  # shell=False by default
于 2012-02-17T02:49:01.653 に答える
5

オフにすると同じように機能するようですshell=True

ドキュメントによると:

Unixの場合、shell = Trueの場合:argsが文字列の場合、シェルを介して実行するコマンド文字列を指定します。つまり、文字列は、シェルプロンプトで入力したときとまったく同じようにフォーマットする必要があります。これには、たとえば、スペースを含むファイル名を引用符または円記号でエスケープすることが含まれます。argsがシーケンスの場合、最初の項目はコマンド文字列を指定し、追加の項目はシェル自体への追加の引数として扱われます。つまり、Popenは次と同等のことを行います。

Popen(['/ bin / sh'、'-c'、args [0]、args [1]、...])

http://docs.python.org/library/subprocess.html

于 2012-02-17T02:51:12.293 に答える