Как выполнить программу оболочки, принимающую входные данные с помощью Python?
Прежде всего, я использую Ubuntu 20.04 и Python 3.8. Я хотел бы запустить программу, которая принимает входные данные из командной строки. Мне удалось запустить программу с python с помощью команды os.system(), но после запуска программы невозможно отправить входные данные. Рассматриваемая программа представляет собой приложение интерфейса продукта, использующее в качестве языка CubeSat Space Protocol (CSP). Однако используемые входные данные кодируются в файле .c с соответствующим заголовком .h.
В оболочке это выглядит так:запуск программы
В питоне это выглядит так:
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
Вывод такой же, как и в оболочке, но без "вывода cmp identity", то есть для меня невозможно использовать csp-client #
Как вы, наверное, заметили, я настоящий новичок, пытающийся быть максимально ясным и точным. Я, конечно, могу попытаться дать больше информации, если потребуется. Спасибо за вашу помощь !
2 ответа
Это звучит как
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()
Я попытаюсь дать вам несколько советов, чтобы вы начали - хотя имейте в виду, что я не знаю ни одного из ваших инструментов, т.е. или , но, надеюсь, это не будет иметь значения.
Я пронумерую свои пункты, чтобы вы могли легко обратиться к шагам.
Пункт 1
Если это система сборки, я бы не стал запускать ее каждый раз, когда вы хотите запустить свой файл . Просто используйте
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
Но это довольно раздражает, поэтому я бы сделал символическую ссылку на это, чтобы вы могли запустить его только с помощью:
Итак, я бы сделал эту символическую ссылку с помощью:
ln -s /home/augustin/workspaceGS/gs-sw-nanosoft-product-interface-application-2.5.1/build/csp-client /usr/local/bin/csp-client
Вам МОЖЕТ понадобиться поставить в начале этой команды. Как только вы это сделаете, вы сможете просто запустить:
csp-client -k/dev/ttyUSB1
Пункт 3
Ваш код Python не работает, потому что каждый запускает совершенно новую оболочку, не связанную с предыдущей строкой или оболочкой. И оболочка, которую он запускает, затем закрывается перед вашим следующим
os.system()
команда.
В результате команда никогда не переходит в файл . Вам действительно нужно отправить
cmp ident
команда на
stdin
или "стандартный ввод "
csp-client
. На Python можно так сделать, это описано здесь, но для новичка не все так просто.
Вместо этого, если вам нужно отправить всего несколько ограниченных команд, таких как «сделать снимок» , я бы создал и протестировал полные сценарии в терминале, пока не получил их правильно, а затем просто вызывал их из 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')