generated from github/codespaces-blank
-
Notifications
You must be signed in to change notification settings - Fork 1
/
terminal.py
172 lines (151 loc) · 5.71 KB
/
terminal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import os
import shutil
import subprocess
import tkinter as tk
from tkinter import ttk
from concurrent.futures import ThreadPoolExecutor
from prompt_toolkit import PromptSession
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
self.executor = ThreadPoolExecutor(max_workers=5)
def create_widgets(self):
# 创建输入框和按钮
self.input = tk.Entry(self)
self.input.pack(side="left")
self.run_button = tk.Button(self, text="Run", command=self.execute_command)
self.run_button.pack(side="left")
# 创建文本框
self.result_text = tk.Text(self, height=10, width=50)
self.result_text.pack(side="bottom")
self.result_text.config(state=tk.DISABLED)
def execute_command(self):
command = self.input.get()
self.executor.submit(self.execute_command_in_thread, command)
def execute_command_in_thread(self, command):
try:
result = subprocess.run(command, shell=True, capture_output=True, text=True, timeout=10)
output = result.stdout.strip()
error = result.stderr.strip()
self.update_result_text(f"{output}\n{error}")
except subprocess.CalledProcessError as e:
self.update_result_text(f"Command '{e.cmd}' returned non-zero exit status {e.returncode}")
except subprocess.TimeoutExpired as e:
self.update_result_text(f"Command '{e.cmd}' timed out after {e.timeout} seconds")
except Exception as e:
self.update_result_text(f"Error executing command: {e}")
def update_result_text(self, text):
self.result_text.config(state=tk.NORMAL)
self.result_text.insert(tk.END, text + '\n')
self.result_text.config(state=tk.DISABLED)
def execute_command(command):
command_parts = command.split()
if not command_parts:
return
cmd = command_parts[0]
args = command_parts[1:]
try:
if cmd == 'cd':
if args:
os.chdir(args[0])
print(f"Changed current directory to: {os.getcwd()}")
else:
print("No directory specified.")
elif cmd == 'ls':
files = os.listdir(os.getcwd())
for file in files:
print(file)
elif cmd == 'mkdir':
if args:
os.mkdir(args[0])
print(f"Created directory: {args[0]}")
else:
print("No directory name specified.")
elif cmd == 'rm':
if args:
for arg in args:
if os.path.isfile(arg):
os.remove(arg)
print(f"Removed file: {arg}")
elif os.path.isdir(arg):
shutil.rmtree(arg)
print(f"Removed directory: {arg}")
else:
print(f"No such file or directory: {arg}")
else:
print("No file or directory name specified.")
elif cmd == 'cp':
if len(args) >= 2:
source = args[0]
destination = args[1]
shutil.copy(source, destination)
print(f"Copied file/directory from {source} to {destination}")
else:
print("Insufficient arguments. Usage: cp <source> <destination>")
elif cmd == 'mv':
if len(args) >= 2:
source = args[0]
destination = args[1]
shutil.move(source, destination)
print(f"Moved file/directory from {source} to {destination}")
else:
print("Insufficient arguments. Usage: mv <source> <destination>")
elif cmd == 'cat':
if args:
for arg in args:
try:
with open(arg) as file:
contents = file.read()
print(contents)
except FileNotFoundError:
print(f"File '{arg}' not found.")
else:
print("No file name specified.")
else:
result = subprocess.run(command, shell=True, capture_output=True, text=True, timeout=10)
output = result.stdout.strip()
if output:
print(output)
error = result.stderr.strip()
if error:
print(error)
except subprocess.CalledProcessError as e:
print(f"Command '{e.cmd}' returned non-zero exit status {e.returncode}")
except subprocess.TimeoutExpired as e:
print(f"Command '{e.cmd}' timed out after {e.timeout} seconds")
except Exception as e:
print(f"Error executing command: {e}")
def execute_script(script_file):
try:
with open(script_file) as file:
script = file.read()
execute_command(script)
except FileNotFoundError:
print(f"Script file '{script_file}' not found.")
except Exception as e:
print(f"Error executing script: {e}")
def main():
session = PromptSession()
while True:
try:
user_input = session.prompt('>>> ')
if user_input.lower() == 'exit':
break
else:
execute_command(user_input)
except KeyboardInterrupt:
continue
except EOFError:
break
if __name__ == '__main__':
# 创建图形界面应用程序
root = tk.Tk()
app = Application(master=root)
# 运行命令行交互程序
main()
# 启动图形界面应用程序
app.mainloop()
prompt_toolkit