मैं पाइथन (2.7.2) के माध्यम से कुछ एंड्रॉइड एडीबी खोल कमांड को स्वचालित करने के लिए एक रैपर लिख रहा हूं। चूंकि, कुछ मामलों में, मुझे अतुल्यकालिक आदेश चलाने की आवश्यकता है, मैं subprocess का उपयोग कर रहा हूं। खोल आदेश जारी करने के लिए विधि विधि।subprocess.Popen और shlex.split स्वरूपण विंडोज़ और लिनक्स में
# 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
मैं shlex .split उपयोग करने की कोशिश की है:
मैं Popen
विधि है, जहां आदेश/आर्ग विभाजन वहाँ की आवश्यकता होती है [command, args]
पैरामीटर के स्वरूपण के साथ किसी समस्या का सामना किया है विंडोज और लिनक्स के बीच अलग है(), पॉज़िक्स ध्वज के साथ और साथ:
# Windows
posix = False
print shlex.split(cmd, posix = posix), posix
# Linux
posix = True
print shlex.split(cmd, posix = posix), posix
दोनों मामले एक ही विभाजन को वापस करते हैं।
वहाँ 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()
समान परिणाम प्राप्त होता है।
आपने प्रश्न में एक टाइपो बनाया है। शेलेक्स बनाम शेक्स। – jgritty
@jgritty धन्यवाद। सही किया। –
आप 'shell = True' का उपयोग क्यों करते हैं? – jfs