python如何运行一个python程序_python程序如何运行另一个python程序,就好像它是从单独的SSH终端运行一样?...

在运行Jessie的Raspberry Pi 2上,我有两个显示器,一个(默认)HDMI显示器和一个LCD触摸屏(需要使用os.environ设置几个与SDL相关的变量).

我有两个pygame程序,lcd.py和hdmi.py,当从不同的SSH终端运行时,很好地共存,lcd.py dsiplays几个按钮,hdmi.py在附加的HDMI显示器上显示幻灯片.

如果我在两个SSH终端中单独运行它们(作为’pi’用户,使用sudo python PROGRAM),lcd.py显示到LCD,hdmi.py显示到HDMI屏幕的幻灯片.

但是,我无法弄清楚如何让lcd.py调用hdmi.py程序作为一个完全独立的进程(因此它有自己的env变量,并且可以独立于驱动LCD显示器的父进程驱动HDMI显示).

lcd.py程序有一个按钮,触摸时调用例程startSlideShow()

但是,我在lcd.py startSlideShow()中尝试启动hdmi.py的各种事情都失败了:

def startSlideShow():

# when running in SSH the correct command is

# sudo python /home/pi/Desktop/code/hdmi.py

# or sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py

# tried various ways of invoking hdmi.py via

# os.fork(), os.spawnl(), subprocess.Popen()

WHAT GOES HERE?

不需要进行持续的进程间通信.除了当lcd.py程序需要“启动”hdmi.py程序时,它们不需要进行通信,对我来说,终止lcd是否终止hdmi.py程序并不重要.

我在startSlideShow()中尝试的东西不起作用:

cmd = "sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py"

pid = os.spawnl(os.P_NOWAIT, cmd)

# lcd.py keeps running, but creates a zombie process [python] instead of running hdmi.py

cmd = "sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py"

pid = os.spawnl(os.P_DETACH, cmd)

# lcd.py exits with error AttributeError: 'module' object has no attribute 'P_DETACH'

cmd = "sudo /usr/bin/python /home/pi/Desktop/code/hdmi.py"

pid = os.spawnl(os.P_WAIT, cmd)

# no error message, returns a pid of 127, but does nothing, and no such process exists when I run `ps aux` in another SSH terminal

cmd = ["/usr/bin/python", "/home/pi/Desktop/code/hdmi.py" ]

pid = subprocess.Popen(cmd, stdout=subprocess.PIPE).pid # call subprocess

# runs the hdmi.py program, but output goes to LCD not HDMI

# (the 2 programs alternately take over the same screen)

cmd = ["/usr/bin/python", "/home/pi/Desktop/code/hdmi.py" ]

pid = subprocess.Popen(cmd).pid

# as above, both programs run on same display, which flashes between the two programs

pid = os.spawnlp(os.P_NOWAIT, "/usr/bin/python", "/home/pi/Desktop/code/hdmi.py")

# invokes python interpreter, get >>> on SSH terminal

pid = os.spawnlp(os.P_NOWAIT, "/usr/bin/python /home/pi/Desktop/code/hdmi.py")

# creates zombie process [python]

解决方法:

为了给子进程提供与父进程不同的环境变量值,可以使用POP构造函数的env参数并提供所需的值.例如,这应该允许您提供不同的DISPLAY值.

标签:python,subprocess

来源: https://codeday.me/bug/20190702/1355979.html

以下是一个简单的Python SSH巡检程序示例,使用paramiko库实现SSH连接和远程命令执行: ```python import paramiko # 连接SSH远程主机函数 def ssh_connect(host, port, username, password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=host, port=port, username=username, password=password) return ssh # 执行远程命令函数 def ssh_command(ssh, command): stdin, stdout, stderr = ssh.exec_command(command) result = stdout.read().decode() if result: return result else: return stderr.read().decode() # 巡检函数,执行多个命令并输出结果 def check_server(host, port, username, password): ssh = ssh_connect(host, port, username, password) print('=================巡检开始=================') print(f'主机名:{host}') print(f'当前时间:{ssh_command(ssh, "date")}') print(f'系统版本:{ssh_command(ssh, "cat /etc/issue")}') print(f'CPU使用率:{ssh_command(ssh, "top -bn1 | grep Cpu | awk \'NR==1{print $2}\'")}') print(f'内存使用率:{ssh_command(ssh, "free | grep Mem | awk \'{print $3/$2 * 100.0}\'")}%') print('=================巡检结束=================') ssh.close() # 调用巡检函数 check_server('192.168.1.100', 22, 'root', 'password') ``` 以上程序中,`ssh_connect()`函数用于连接SSH远程主机,`ssh_command()`函数用于执行远程命令并返回结果,`check_server()`函数用于执行多个命令并输出结果。可以根据实际需求修改命令内容和输出格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值