簡體   English   中英

如何在此處拆分命令以使用 subprocess.Popen()

[英]How to split up the command here for using subprocess.Popen()

ip = subprocess.Popen(["/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep \"inet addr\" | awk -F: '{print $2}' | awk \'{print $1}\'"], stdout=subprocess.PIPE)

我不確定在哪里放置逗號來分隔它們以使用 subprocess.Popen 使用此命令。 有人知道嗎?

您正在使用外殼功能(管道),因此應該拆分該命令,而不是拆分命令,而應使用shell=True將其作為單個字符串(而不是列表)傳遞

ip = subprocess.Popen("/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') | grep \"inet addr\" | awk -F: '{print $2}' | awk \'{print $1}\'",
    shell=True,
    stdout=subprocess.PIPE)

這就是我的建議。

創建具有此內容的文件-將其稱為“ route-info”並使其可執行:

#!/bin/sh

/sbin/ifconfig $(/sbin/route | awk '/default/ {print $8}') |
    grep "inet addr" |
    awk -F: '{print $2}' |
    awk '{print $1}'

在您的python程序中,使用:

ip = subprocess.Popen(["/path/to/route-info"], stdout=subprocess.PIPE)

然后,您不必擔心引號,可以獨立測試route-info腳本以確保其正常工作。

腳本route-info不會接受任何命令行參數,但是如果這樣做,您將如何傳遞它們:

ip = subprocess.Popen(["/path/to/route-info", arg1, arg2, ...], stdout=subprocess.PIPE)

這里引用subprocess.Popen的官方文檔

如何將 shell 命令分解為一系列參數可能並不明顯,尤其是在復雜的情況下。 shlex.split() 可以說明如何確定 args 的正確標記化:

 import shlex, subprocess command_line = input() args = shlex.split(command_line) print(args) p = subprocess.Popen(args) # Success!

shlex包含在標准庫中,因此您無需安裝它。

str.split()這樣寫在一行中應該是這樣的:

import shlex
import subprocess 

command = "ls -l"
proc = subprocess.Popen(shlex.split(command) , stdout = subprocess.PIPE , stderr = subprocess.PIPE)
output , errors = proc.communicate()
print(output , errors)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM