1

首先,我使用的是 Ubuntu 20.04 和 Python 3.8。我想运行一个接受命令行输入的程序。我设法使用 os.system() 命令从 python 启动程序,但启动程序后无法发送输入。有问题的程序是使用 CubeSat 空间协议 (CSP) 作为语言的产品界面应用程序。但是,使用的输入被编码在一个带有相应 .h 标头的 .c 文件中。

在 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#

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

4

2 回答 2

1

听起来该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()
于 2021-11-13T22:10:50.400 回答
0

我会尝试给您一些提示以帮助您入门 - 尽管请记住我不知道您的任何工具,即wafor 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 无关。然后它启动的 shell 在你的下一个os.system()命令之前退出。

因此,该cmp ident命令永远不会转到csp-client. 您确实需要cmp ident在. stdin_ 您可以在 Python 中做到这一点,它在此处进行了描述,但对于初学者来说并不是那么容易。csp-client

取而代之的是,如果您只需要发送一些有限的命令,例如“拍照”,我会bash在终端中制作和测试完整的脚本,直到我把它们做对,然后从 Python 中调用它们。所以,我会bash在你的 HOME 目录中创建一个脚本,命名为,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-13T16:45:17.143 回答