import socket import select import subprocess def run_server(): # host = '127.0.0.1' host = '0.0.0.0' port = 21234 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # s.setblocking(False) s.bind((host, port)) s.listen(1) print(f'Server listening on {host}:{port}') while True: rlist, _, _ = select.select([s], [], [], 0) if not rlist: continue conn, addr = s.accept() print(f'Connected by {addr}') data = conn.recv(1024, timeout=1) if not data: break command = data.decode('utf-8') print(f'Received command: {command}') valid_cmd_list = ['Bcompare', 'npp', 'explorer'] for cmd_item in valid_cmd_list: print(f'check command type:', cmd_item) if command.startswith(cmd_item): print(f'valid command type:', cmd_item) process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) process.communicate() response = 'Valid command: ' + command + ", result: " + result.stdout.decode('utf-8') + "; " print(f'valid command response:', response) else: response = 'Invalid command' print(f'invalid command type') conn.sendall(response.encode('utf-8')) conn.close() s.close() if __name__ == '__main__': run_server()
时间: 2024-02-14 16:27:30 浏览: 131
这段代码实现了一个简单的服务器,它通过接收客户端发送的命令,并在服务器上执行这些命令。服务器通过 TCP socket 监听指定的地址和端口,接受来自客户端的连接。
在接收到连接后,服务器接收客户端发送的命令,并检查命令是否属于预定义的有效命令列表。如果命令属于有效命令列表中的一项,则服务器会使用 `subprocess.Popen()` 方法在服务器上执行该命令,并将结果返回给客户端。
以下是一些需要注意的地方:
1. 服务器绑定的地址是 `'0.0.0.0'`,这意味着它将监听所有网络接口上的连接。如果只想监听本地连接,可以将地址改为 `'127.0.0.1'`。
2. 服务器使用 `select()` 方法来检查是否有待处理的连接请求。这样做是为了使服务器能够非阻塞地运行,即使没有新的连接请求也可以继续执行其他任务。
3. 服务器使用 `recv()` 方法接收客户端发送的数据。在这个示例中,我们设置了一个 1 秒的超时时间,以避免阻塞在 `recv()` 方法上。你可以根据实际需求调整超时时间。
4. 服务器使用 `subprocess.Popen()` 方法在服务器上执行命令,并通过 `communicate()` 方法获取执行结果。请注意,你需要根据实际情况处理命令的输出和错误。
这只是一个简单的示例代码,可能需要根据你的实际需求进行修改和扩展。
相关问题
import tkinter as tkfrom tkinter import filedialogimport subprocessclass GUI(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master = master self.master.title("软件界面") self.pack() self.path_label = tk.Label(self, text="输入路径:") self.path_label.pack() self.path_entry = tk.Entry(self) self.path_entry.pack() self.path_name_label = tk.Label(self, text="输入路径名:") self.path_name_label.pack() self.path_name_entry = tk.Entry(self) self.path_name_entry.pack() self.run_button = tk.Button(self, text="运行", command=self.run_program) self.run_button.pack() self.output_label = tk.Label(self, text="输出:") self.output_label.pack() self.output_text = tk.Text(self) self.output_text.pack() def run_program(self): path = self.path_entry.get() path_name = self.path_name_entry.get() cmd = ['python', 'yourprogram.py', path, path_name] result = subprocess.run(cmd, capture_output=True) self.output_text.insert(tk.END, result.stdout.decode())if __name__ == "__main__": root = tk.Tk() app = GUI(master=root) app.mainloop() 和import sysif __name__ == "__main__": # 获取从命令行传递过来的参数 path = sys.argv[1] path_name = sys.argv[2] # 在这里写你的程序逻辑 # ...这2个代码怎么关联不上
这两段代码是用来实现从界面输入路径和路径名,然后调用命令行运行Python程序的。具体来说,第一段代码是使用tkinter库创建了一个GUI界面,包括两个输入框、一个运行按钮和一个输出框。当用户点击运行按钮时,会获取输入框中的路径和路径名,并将其作为参数调用subprocess库运行Python程序。
而第二段代码则是一个独立的Python程序,它使用sys库获取命令行传递的参数,然后根据路径和路径名执行相应的程序逻辑。这段代码需要在第一段代码中调用,使用subprocess库运行该Python程序,并传递路径和路径名作为参数。具体来说,第一段代码的cmd变量中的'yourprogram.py'应该替换为第二段代码的Python程序文件名。
import os import subprocess def extract_audio(filename): # 提取音频 cmd = 'ffmpeg -i {} -vn -acodec copy audio.mp3'.format(filename) subprocess.call(cmd, shell=True) def remove_vocals(filename): # 使用spleeter库去掉人声 cmd = 'spleeter separate -p spleeter:2stems -o output audio.mp3' subprocess.call(cmd, shell=True) def convert_to_wav(filename): # 将音频文件转换为wav格式 cmd = 'ffmpeg -i output/audio/accompaniment.wav -acodec pcm_s16le -ac 1 -ar 16000 final.wav' subprocess.call(cmd, shell=True) def clean_up(): # 删除过程中生成的音频文件 os.remove('audio.mp3') os.remove('final.wav') os.removedirs('output') if name == 'main': # 文件名 filename = '这世界那么多人.mp3' # 提取音频 extract_audio(filename) # 去除人声 remove_vocals('3544242627.mp3') # 转换格式 convert_to_wav(filename) # 删除过程中生成的文件 clean_up() 这串代码的remove_vocals()函数该输什么文件
在函数参数中传入的应该是提取音频后的音频文件名,即'audio.mp3'。因此,修改代码如下:
```
def remove_vocals(filename):
# 使用spleeter库去掉人声
cmd = 'spleeter separate -p spleeter:2stems -o output {}'.format(filename)
subprocess.call(cmd, shell=True)
```
同时,在主函数中调用remove_vocals()函数时,应该传入提取音频后的音频文件名,即'audio.mp3'。因此,修改代码如下:
```
if __name__ == '__main__':
# 文件名
filename = '这世界那么多人.mp3'
# 提取音频
extract_audio(filename)
# 去除人声
remove_vocals('audio.mp3')
# 转换格式
convert_to_wav(filename)
# 删除过程中生成的文件
clean_up()
```
阅读全文