大家好,我在树莓派-3做一辆车。我正在发送一些shh命令。我的问题是我不想直接发送shh命令,虽然我想发送python控制台输出的输出,但我该怎么做?
发布于 2017-10-17 13:35:06
您可以在python中使用OS库,这将允许python程序与unix shell集成。
#Import Library
import os
#Set the action to 0 as it's not needed right now
action = 0
#Loop infinitely
while True:
#First of all, list the available actions and let the user choose one.
print('Actions that can be performed')
print('ID. Action')
print('')
print('1. Go Forward')
print('2. Go Backwards')
print('3. Stop')
print('')
print('0. Stop and exit program')
print('')
#Ask the 'driver' what they want the car to do. Program will hang continuing
#to perform any current action that was previously selected until a different
#action is provided.
action = int(input('Enter the numerical ID of the action and press return: '))
#Do the action based on the numerical ID
if(action == 1):
os.system('shell-command-to-go-forward')
if(action == 2):
os.system('shell-command-to-go-backward')
if(action == 3):
os.system('shell-command-to-stop-everything')
if(action == 0):
os.system('shell-command-to-stop-everything')
exit(0)
如果这不是你想要做的,请你说得更具体一些。python脚本是否应该接受任何形式的用户输入?
发布于 2017-10-17 15:00:33
我无法帮助您实现您所寻求的ssh功能,因为我从未尝试过该功能,现在也没有可用的工具可供尝试。然而,我不认为这是一个合适的工具。相反,我附加了一个带有tkinter GUI的套接字服务器示例,按下箭头键将事件发送到套接字服务器,然后可以对其执行操作。
server.py:
import socket
# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
server_address = ('localhost', 10000)
print('starting up on %s port %s' % server_address)
sock.bind(server_address)
while True:
try:
# Listen for incoming connections
sock.listen(1)
while True:
# Wait for a connection
print('waiting for a connection')
connection, client_address = sock.accept()
try:
print('connection from', client_address)
# Receive the data in small chunks and retransmit it
while True:
data = connection.recv(16)
if data:
print('received "%s"' % data)
# here you can test the character received and act accordingly
# you could also opt to send data back the other way
# print('sending data back to the client')
# connection.sendall(data)
else:
print('no more data from', client_address)
break
finally:
# Clean up the connection
connection.close()
except:
pass
client.py
import socket
import tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Car control")
self.sock = None
self.addr = tk.Entry(self)
self.addr.insert(0, "127.0.0.1")
self.addr.grid(column=1, row=1, sticky="nesw")
self.button = tk.Button(self, text="Connect", command=self.connect)
self.button.grid(column=2, row=1, sticky="nesw")
self.bind("<KeyPress>", self.handle_binding)
self.bind("<KeyRelease>", self.handle_binding)
def connect(self):
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.addr.get(),10000))
self.addr.configure(state="disabled")
self.button.configure(text="Disconnect", command=self.disconnect)
self.focus()
except (ConnectionRefusedError, socket.gaierror):
pass
def disconnect(self):
self.sock.close()
self.sock = None
self.addr.configure(state="normal")
self.button.configure(text="Connect", command=self.connect)
def send(self, data):
if self.sock:
self.sock.sendall(data.encode('utf8'))
def handle_binding(self, event):
if event.widget != self.addr: # ignore key events aimed at texkbox
char = ""
if event.keysym == "Up":
char = "u"
elif event.keysym == "Down":
char = "d"
elif event.keysym == "Left":
char = "l"
elif event.keysym == "Right":
char = "r"
if event.type == '2': # pressed
self.send(char)
elif event.type == '3': # released
self.send(char.upper())
if __name__ == "__main__":
app = App()
app.mainloop()
https://stackoverflow.com/questions/46791194
复制