首先,我使用的是 Ubuntu 20.04 和 Python 3.8。我想運行一個接受命令列輸入的程式。我設法使用 os.system() 命令從 python 啟動程式,但啟動程式后無法發送輸入。該程式是一個產品界面應用程式,它使用 CubeSat Space Protocol (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#
正如您可能看到的,我是一個真正的初學者,試圖盡可能地清晰和準確。如果需要,我當然可以嘗試提供更多資訊。謝謝你的幫助 !
uj5u.com熱心網友回復:
聽起來該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()
uj5u.com熱心網友回復:
我會嘗試給您一些提示以幫助您入門 - 盡管請記住,我不了解您的任何工具,即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 無關。然后它啟動的 shell 在您的下一個os.system()命令之前退出。
因此,該cmp ident命令永遠不會轉到csp-client. 你真的需要發送cmp ident的命令stdin或“標準輸入”的csp-client。你可以做到這一點在Python中,它被描述在這里,但它不是那么容易的初學者。
取而代之的是,如果您只需要發送一些有限的命令,例如“拍照”,我會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
If that works, you can copy the script to /usr/local/bin with:
cp $HOME/csp-snap /usr/local/bin
You may need sudo at the start again.
Then you should be able to take photos from anywhere just with:
csp-snap
Then your Python code becomes easy:
os.system('/usr/local/bin/csp-snap')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/359469.html
