Как выполнить программу оболочки, принимающую входные данные с помощью 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')
Другие вопросы по тегам