首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用python执行接受输入的shell程序?

如何使用python执行接受输入的shell程序?
EN

Stack Overflow用户
提问于 2021-11-12 13:57:21
回答 2查看 562关注 0票数 1

首先,我使用的是Ubuntu20.04和Python3.8。我想运行一个接受命令行输入的程序。我使用os.system()命令成功地从python启动了程序,但是在启动程序之后,不可能发送输入。该程序是一个使用CubeSat空间协议(CSP)作为语言的产品接口应用程序。但是,所使用的输入是用相应的.c头在一个.h文件中编码的。

在shell中,它看起来如下:启动程序

在python中,如下所示:

代码语言:javascript
复制
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#

正如你可能看到的,我是一个真正的初学者,试图尽可能的清晰和精确。如果需要的话,我当然可以尝试提供更多的信息。谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-13 16:45:17

我将尝试给您一些提示,让您开始--不过请记住,我不知道您的任何工具,即wafcsp-client,但希望这不会有什么关系。

我将对我的要点进行编号,这样你就可以很容易地参考这些步骤。

点1

如果waf是一个构建系统,那么每次您想运行csp-client时,我都不会继续运行它。当您更改代码时,只需使用waf进行重新构建--这将节省时间。

点2

当您将目录更改为/home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1,然后运行./build/csp-client时,您实际上正在运行:

代码语言:javascript
复制
/home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1/build/csp-client -k/dev/ttyUSB1

但是这很烦人,所以我会从/usr/local/bin中创建一个符号链接,这样您就可以通过以下方式运行它:

代码语言:javascript
复制
csp-client -k/dev/ttyUSB1

所以,我要把这个符号联系起来:

代码语言:javascript
复制
ln -s /home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1/build/csp-client  /usr/local/bin/csp-client

您可能需要将sudo放在该命令的开头。一旦你有了它,你就可以跑了:

代码语言:javascript
复制
csp-client -k/dev/ttyUSB1

点3

您的Python代码无法工作,因为每个os.system()都启动一个与前面的行或shell无关的全新shell。然后在下一个os.system()命令之前退出它启动的shell。

因此,cmp ident命令永远不会转到csp-client。您确实需要将cmp ident命令发送到stdincsp-client的“标准输入”上。您可以在Python中这样做,它被描述为这里,但对于初学者来说并不是那么容易。

相反,如果您只需要发送一些有限的命令,比如“拍照”,我就会在终端中制作和测试完整的bash脚本,直到我正确地得到它们,然后从Python调用它们。因此,我会在您的主目录中创建一个名为“bash”的csp-snap脚本,并将类似的内容放在其中:

代码语言:javascript
复制
#/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

现在,使用以下命令使该可执行文件(只需要一次):

代码语言:javascript
复制
chmod +x $HOME/csp-snap

然后您可以使用以下方法进行测试:

代码语言:javascript
复制
$HOME/csp-snap

如果这样做有效,您可以使用以下方法将脚本复制到/usr/local/bin

代码语言:javascript
复制
cp $HOME/csp-snap /usr/local/bin

您可能在开始时需要sudo

然后你就可以在任何地方拍摄照片,只要:

代码语言:javascript
复制
csp-snap

然后,Python代码变得很简单:

代码语言:javascript
复制
os.system('/usr/local/bin/csp-snap')
票数 0
EN

Stack Overflow用户

发布于 2021-11-13 22:10:50

听起来,pexpect模块可能是您想要的,而不是使用os.system,它是为控制其他应用程序和与它们交互而设计的,就像人类正在使用它们一样。它的文档是可用的这里。但你想要的可能是这样的:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69944050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档