从单独的 Python 脚本向 Python 脚本执行命令?
Execute command to a Python script from separate Python script?
我正在尝试将命令从一个 python 脚本发送到终端中的另一个 运行。
我在 RPi 运行 Raspbian 上 运行 两个 python 脚本。第一个脚本是一个循环,等待用户输入数字并将其加到总数中。第二个脚本使用 PySide2 在 QPushButton 被释放时打印一个数字。
我怎样才能让释放 QPushButton 时运行的函数将命令(或变量)发送到等待的第一个脚本并执行它?
我已经阅读了一些关于使用 subprocess.call
和 os.system
的内容,但我不太确定我在用这些命令做什么,或者它们是否适合我想要的去做。
第一个脚本:
x = 0
while x < 10:
y = int(input("enter number:"))
x += y
print(x)
print("x is ten!")
第二个脚本:
import sys
from PySide2.QtWidgets import *
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
self.btn = QPushButton("test")
layout = QVBoxLayout()
layout.addWidget(self.btn)
self.setLayout(layout)
self.btn.released.connect(self.btnpress)
def btnpress(self):
print(1)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
我认为您必须添加第三方,例如:
- 数据库
- REDIS
- 文件
但是您不能不将命令从 运行 脚本发送到另一个 运行 脚本,
因为 CLI 脚本只等待来自他 shell 的命令。
问候
如果您想 运行 脚本并通过标准输入发送信息,那么在 Qt 中最好的选择是使用 QProcess:
import os.path
import sys
from PySide2.QtCore import QProcess
from PySide2.QtWidgets import QApplication, QPushButton, QSpinBox, QVBoxLayout, QWidget
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
self.btn = QPushButton("test")
self.spinbox = QSpinBox()
self.process = QProcess()
self.process.readyReadStandardError.connect(self.handle_readyReadStandardError)
self.process.readyReadStandardOutput.connect(
self.handle_readyReadStandardOutput
)
self.process.setProgram(sys.executable)
script_path = os.path.join(CURRENT_DIR, "script.py")
self.process.setArguments([script_path])
self.process.start()
layout = QVBoxLayout(self)
layout.addWidget(self.spinbox)
layout.addWidget(self.btn)
self.btn.released.connect(self.btnpress)
def btnpress(self):
number = self.spinbox.value()
msg = "{}\n".format(number)
self.process.write(msg.encode())
def handle_readyReadStandardError(self):
print(self.process.readAllStandardError().data().decode())
def handle_readyReadStandardOutput(self):
print(self.process.readAllStandardOutput().data().decode())
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
注意:您不必 运行 脚本在一秒钟内 shell 因为脚本本身会启动它。
当存在明确的 parent/child 关系时,子流程才有意义。这听起来更像是你有两个独立的代理人,他们偶尔需要沟通。根据您的需要,有多种 inter-process 通信 (IPC) 机制,最基本的是信号,其中任何一个进程都可以向另一个进程发送一位信息以通知它某个事件发生了。对于更复杂的需求,设置共享内存,或通过套接字或 FIFO 进行通信。
我正在尝试将命令从一个 python 脚本发送到终端中的另一个 运行。
我在 RPi 运行 Raspbian 上 运行 两个 python 脚本。第一个脚本是一个循环,等待用户输入数字并将其加到总数中。第二个脚本使用 PySide2 在 QPushButton 被释放时打印一个数字。
我怎样才能让释放 QPushButton 时运行的函数将命令(或变量)发送到等待的第一个脚本并执行它?
我已经阅读了一些关于使用 subprocess.call
和 os.system
的内容,但我不太确定我在用这些命令做什么,或者它们是否适合我想要的去做。
第一个脚本:
x = 0
while x < 10:
y = int(input("enter number:"))
x += y
print(x)
print("x is ten!")
第二个脚本:
import sys
from PySide2.QtWidgets import *
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
self.btn = QPushButton("test")
layout = QVBoxLayout()
layout.addWidget(self.btn)
self.setLayout(layout)
self.btn.released.connect(self.btnpress)
def btnpress(self):
print(1)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
我认为您必须添加第三方,例如:
- 数据库
- REDIS
- 文件
但是您不能不将命令从 运行 脚本发送到另一个 运行 脚本, 因为 CLI 脚本只等待来自他 shell 的命令。 问候
如果您想 运行 脚本并通过标准输入发送信息,那么在 Qt 中最好的选择是使用 QProcess:
import os.path
import sys
from PySide2.QtCore import QProcess
from PySide2.QtWidgets import QApplication, QPushButton, QSpinBox, QVBoxLayout, QWidget
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
self.btn = QPushButton("test")
self.spinbox = QSpinBox()
self.process = QProcess()
self.process.readyReadStandardError.connect(self.handle_readyReadStandardError)
self.process.readyReadStandardOutput.connect(
self.handle_readyReadStandardOutput
)
self.process.setProgram(sys.executable)
script_path = os.path.join(CURRENT_DIR, "script.py")
self.process.setArguments([script_path])
self.process.start()
layout = QVBoxLayout(self)
layout.addWidget(self.spinbox)
layout.addWidget(self.btn)
self.btn.released.connect(self.btnpress)
def btnpress(self):
number = self.spinbox.value()
msg = "{}\n".format(number)
self.process.write(msg.encode())
def handle_readyReadStandardError(self):
print(self.process.readAllStandardError().data().decode())
def handle_readyReadStandardOutput(self):
print(self.process.readAllStandardOutput().data().decode())
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
注意:您不必 运行 脚本在一秒钟内 shell 因为脚本本身会启动它。
当存在明确的 parent/child 关系时,子流程才有意义。这听起来更像是你有两个独立的代理人,他们偶尔需要沟通。根据您的需要,有多种 inter-process 通信 (IPC) 机制,最基本的是信号,其中任何一个进程都可以向另一个进程发送一位信息以通知它某个事件发生了。对于更复杂的需求,设置共享内存,或通过套接字或 FIFO 进行通信。