亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法將特殊字符傳遞給python中的子進程

無法將特殊字符傳遞給python中的子進程

MMTTMM 2023-02-22 15:10:21
我有這個命令可以獲取從 Unix shell 返回的外部 IP 地址,所以我可以在我的服務器中使用它:ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'在我的 Mac 上,終端返回:192.168.1.3我如何在 python 腳本中輸出這個?我努力了:import subprocesscommand = ['ifconfig', '|', 'sed', '-En', 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p']p = subprocess.Popen(command, stdout=subprocess.PIPE)text = p.stdout.read()retcode = p.wait()我得到錯誤說ifconfig: 界面 | 不存在提前致謝!
查看完整描述

2 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

您的 shell 命令正在調用兩個命令, 的輸出ifconfig用作sed. 您可以使用 subprocess 來模擬它,但sed調用只是進行一些文本操作,因此更簡潔的方法是在該步驟中使用 Python。例如:


import re

import subprocess


pattern = r'inet (?:addr:)?(?!127\.0\.0\.1)((?:\d+\.){3}\d+)'


p = subprocess.Popen(['ifconfig'], stdout=subprocess.PIPE)

text = re.search(pattern, p.stdout.read()).group(1)

retcode = p.wait()


查看完整回答
反對 回復 2023-02-22
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'

您正在嘗試調用 2 個 shell 命令,ifconfig并且sed,沒關系。但是,這些是 shell 命令,在調用subprocess.Poen.


使用communictae方法,最好用在這里。并將命令作為字符串而不是列表發送。


import subprocess


command = ' '.join(['ifconfig', '|', 'sed', '-En', 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'])

p = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)

stdoutdata, stderrdata = p.communicate()  #this is blocking

for line in stdoutdata:

    #do some thing with line

Popen.communicate(input=None)


與進程交互:將數據發送到標準輸入。從 stdout 和 stderr 讀取數據,直到到達文件末尾。等待進程終止??蛇x的輸入參數應該是一個要發送給子進程的字符串,如果沒有數據應該發送給子進程,則為 None。


查看完整回答
反對 回復 2023-02-22
  • 2 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號