Python練手程式碼段(2020.11.11)
import queue
import re
import subprocess
import sys
import threading
import time
import chardet
from typing import List
class PMProcess():
def __init__(self, args: List[str]):
self.terminate = False
self.q = queue.Queue()
self.on_error_received = lambda error: print(error)
self.args = args
self.process = subprocess.Popen(self.args,
stdin=subprocess.PIPE,
shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
self.to = threading.Thread(
target=self.enqueue_stream, args=(
self.process.stdout, self.q, 1))
self.te = threading.Thread(
target=self.enqueue_stream, args=(
self.process.stderr, self.q, 2))
self.tp = threading.Thread(target=self.consoleLoop)
self.to.setDaemon(True)
self.te.setDaemon(True)
self.tp.setDaemon(True)
self.te.start()
self.to.start()
self.tp.start()
def enqueue_stream(self, stream, queue, type): # 將stderr或者stdout寫入到佇列q中。
for line in iter(stream.readline, b''):
if self.terminate: break
encoding = chardet.detect(line)['encoding']
queue.put(str(type) + line.decode(encoding))
stream.close()
def consoleLoop(self): # 封裝後的內容。
# idleLoops = 0
while True:
if not self.q.empty():
line = self.q.get()
if line[0] == '1':
self.on_command_received(line[1:])
else:
self.on_error_received(line[1:])
sys.stdout.flush()
else:
time.sleep(0.01)
# idleLoops += 1
def input(self, message: str):
if not message.endswith('\n'):
message += '\n'
self.process.stdin.write(
message.encode('utf-8')) # 模擬輸入
self.process.stdin.flush()
def on_command_received(self, cmd: str):
# print(cmd)
cmd = cmd.strip()
file_paths = re.findall(r'>(.+?)\(', cmd)
if len(file_paths) > 0:
path = file_paths[0].strip()
splitted = cmd.split(path)
if len(splitted) == 2:
remaining_words = splitted[1].strip()
current_row = re.findall(r'\((.+?)\)', remaining_words)
if len(current_row) >= 1:
print(path, int(current_row[0]))
# if remaining_words.startswith('<'):
# print('file:', file_result.group())
# while(1):
# if cmd.startswith('(Pdb)'):
# cmd = cmd.strip()
# cmd = cmd.strip('(Pdb)')
# else:
# cmd = cmd.strip()
# # if cmd.startswith('>'):
#
# break
print(cmd)
if __name__ == '__main__':
s = r"""
import os
import pmdebug
__global_keys = set(globals().keys())
b E:\Python\pyminer_bin\PyMiner\bin\pmtoolbox\debug\test2.py:2
alias pi for k in locals().keys(): pmdebug.insight(k,locals()[k]);print(12333333333333,os.path.dirname(r'c:\123123'))
alias tobreak c;;pi a
alias ps pi self
"""
pmp = PMProcess(['python', '-u', '-m', 'pdb',
r'E:\Python\pyminer_bin\PyMiner\bin\pmtoolbox\debug\test.py'])
pmp.input(s)
while (1):
pmp.input('c')
time.sleep(2)
pass
相關文章
- 利用Python訓練手勢模型程式碼Python模型
- Fast-RCNN解析:訓練階段程式碼導讀ASTCNN
- Python練手例子(16)Python
- Python練手例子(14)Python
- Python練手例子(13)Python
- Python練手例子(6)Python
- python怎麼隱藏一段程式碼Python
- 50行程式碼,Node爬蟲練手專案 ?️行程爬蟲
- webpack練手專案之easySlide(二):程式碼分割WebIDE
- matlab練習程式(多線段交點)Matlab
- 10個Python練手專案Python
- iOS 程式碼段收集iOS
- javascript常用程式碼段JavaScript
- JS HOOK 程式碼段JSHook
- Python實現裝飾模式的一段程式碼Python模式
- 70個Python經典實用練手專案(附原始碼)Python原始碼
- 淺談c語言程式碼段 資料段 bss段C語言
- CSS程式碼段-scss mixinCSS
- 這段程式碼如何理解?
- 即學即用的 30 段 Python 非常實用的程式碼Python
- Python指令碼練習一Python指令碼
- 包教包會!7段程式碼帶你玩轉Python條件語句(附程式碼)Python
- Python 程式設計練習Python程式設計
- 完整的python專案例項-Python例項練手專案彙總(附原始碼)Python原始碼
- Python練手題,敢來挑戰嗎?Python
- python練手經典100例-推薦幾個適合新手練手的Python專案《python入門例子》Python
- 學python找不到專案練手?別擔心,70個python練手專案給你充實感Python
- 如何在Python退出時強制執行一段程式碼Python
- fasttext訓練模型程式碼AST模型
- [C練習]蛇形程式碼
- 前端必會的程式碼段前端
- 第一段JavaScript程式碼JavaScript
- android 截圖程式碼段Android
- 無聊程式碼一段
- python指令碼練習筆記Python指令碼筆記
- 給Python初學者的最好練手專案Python
- 好用到哭!你需要立刻學會的20個Python程式碼段Python
- 【有趣】這段java程式碼太古怪Java