繁体   English   中英

从单独的 Python 脚本向 Python 脚本执行命令?

[英]Execute command to a Python script from separate Python script?

我正在尝试将命令从一个 python 脚本发送到另一个在终端中运行的脚本。

我在运行 Raspbian 的 RPi 上运行两个 python 脚本。 第一个脚本是一个循环,等待用户输入数字并将其加到总数中。 第二个脚本使用 PySide2 在 QPushButton 被释放时打印一个数字。

我怎样才能使在释放 QPushButton 时运行的 function 将命令(或变量)发送到等待的第一个脚本并执行它?

我已经阅读了一些关于使用subprocess.callos.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_()

在此处输入图像描述

如果你想运行脚本并通过 stdin 发送信息,那么在 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 中运行脚本,因为脚本本身会启动它。

当存在明确的父/子关系时,子流程才有意义。 这听起来更像是你有两个独立的代理人,他们偶尔需要沟通。 根据您的需要,有多种进程间通信 (IPC) 机制,最基本的是信号,其中任何一个进程都可以向另一个进程发送一位信息以通知它某个事件发生了。 对于更复杂的需求,设置共享 memory,或通过套接字或 FIFO 通话。

我认为您必须添加第三方,例如:

  1. 数据库
  2. REDIS
  3. 文件

但是你不能不从一个正在运行的脚本向另一个正在运行的脚本发送命令,因为 CLI 脚本只等待来自他的 shell 的命令。 问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM