首先,我使用的是Ubuntu20.04和Python3.8。我想运行一个接受命令行输入的程序。我使用os.system()命令成功地从python启动了程序,但是在启动程序之后,不可能发送输入。该程序是一个使用CubeSat空间协议(CSP)作为语言的产品接口应用程序。但是,所使用的输入是用相应的.c头在一个.h文件中编码的。
在shell中,它看起来如下:启动程序
在python中,如下所示:
import os
os.chdir('/home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1')
os.system('./waf')
os.system('./build/csp-client -k/dev/ttyUSB1')
os.system('cmp ident') #cmp ident is typically the kind of command that does not work on python输出与shell中的输出相同,但没有"cmp ident输出“,也就是说,我不可能使用csp-client#
正如你可能看到的,我是一个真正的初学者,试图尽可能的清晰和精确。如果需要的话,我当然可以尝试提供更多的信息。谢谢你的帮助!
发布于 2021-11-13 16:45:17
我将尝试给您一些提示,让您开始--不过请记住,我不知道您的任何工具,即waf或csp-client,但希望这不会有什么关系。
我将对我的要点进行编号,这样你就可以很容易地参考这些步骤。
点1
如果waf是一个构建系统,那么每次您想运行csp-client时,我都不会继续运行它。当您更改代码时,只需使用waf进行重新构建--这将节省时间。
点2
当您将目录更改为/home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1,然后运行./build/csp-client时,您实际上正在运行:
/home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1/build/csp-client -k/dev/ttyUSB1但是这很烦人,所以我会从/usr/local/bin中创建一个符号链接,这样您就可以通过以下方式运行它:
csp-client -k/dev/ttyUSB1所以,我要把这个符号联系起来:
ln -s /home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1/build/csp-client /usr/local/bin/csp-client您可能需要将sudo放在该命令的开头。一旦你有了它,你就可以跑了:
csp-client -k/dev/ttyUSB1点3
您的Python代码无法工作,因为每个os.system()都启动一个与前面的行或shell无关的全新shell。然后在下一个os.system()命令之前退出它启动的shell。
因此,cmp ident命令永远不会转到csp-client。您确实需要将cmp ident命令发送到stdin或csp-client的“标准输入”上。您可以在Python中这样做,它被描述为这里,但对于初学者来说并不是那么容易。
相反,如果您只需要发送一些有限的命令,比如“拍照”,我就会在终端中制作和测试完整的bash脚本,直到我正确地得到它们,然后从Python调用它们。因此,我会在您的主目录中创建一个名为“bash”的csp-snap脚本,并将类似的内容放在其中:
#/bin/bash
# Extend PATH so we can find "/usr/local/bin/csp-client"
PATH=$PATH:/usr/local/bin
{
# Tell client to take picture
echo "nanoncam snap"
# Exit csp-client
echo exit
} | csp-client -k/dev/ttyUSB1现在,使用以下命令使该可执行文件(只需要一次):
chmod +x $HOME/csp-snap然后您可以使用以下方法进行测试:
$HOME/csp-snap如果这样做有效,您可以使用以下方法将脚本复制到/usr/local/bin:
cp $HOME/csp-snap /usr/local/bin您可能在开始时需要sudo。
然后你就可以在任何地方拍摄照片,只要:
csp-snap然后,Python代码变得很简单:
os.system('/usr/local/bin/csp-snap')发布于 2021-11-13 22:10:50
听起来,pexpect模块可能是您想要的,而不是使用os.system,它是为控制其他应用程序和与它们交互而设计的,就像人类正在使用它们一样。它的文档是可用的这里。但你想要的可能是这样的:
import pexpect
p = pexpect.spawnu("/home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1/build/csp-client -k/dev/ttyUSB1")
p.expect("csp-client")
p.sendline("cmp indent")
print(p.read())
p.close()https://stackoverflow.com/questions/69944050
复制相似问题