2016-03-29 3 views
2

Прежде всего, я хотел бы сказать, что я новичок на этом сайте, и всякая критика оценивается.Переменные Python и subprocess.call

Я пытаюсь изменить скрипт Python для чтения ключа rfid, а затем передать переменную UID скрипту (bash), который будет его аутентифицировать и т. Д. До сих пор мне удалось изолировать UID, и я могу его распечатать python, но я не могу получить его в сценарии bash.

print "" + str(uid[0]) + "" + str(uid[1]) + ""+ str(uid[2]) + "" + str(uid[3]) 

Вот строка, которую я использую для печати uid, как я могу передать это сценарию bash? Благодаря!

+0

Просто попробуйте 'python script.py | bashscript' или если вы вызываете python внутри скрипта bash: 'python script.py | bash_command' – ritesht93

+0

Используя [pipe] (http://www.linfo.org/pipe.html)? : D – jDo

+0

Сценарий python должен выполнять скрипт bash каждый раз, когда есть новый тег, будет ли это достигнуто путем простого его соединения? EDIT: Забыл упомянуть, что я думаю, что есть способ использовать подпроцесс для этого. –

ответ

1

Используйте модуль подпроцесс:

import subprocess 

uid = str(uid[0]) + str(uid[1]) + str(uid[2]) + str(uid[3]) 
result = subprocess.run(['check.sh', uid], stdout=subprocess.PIPE) 
print(result.stdout) 

Если вы используете версию питона до 3,5, а run вы должны использовать call.

Чтобы это сработало, программа bash должна принимать uid как аргумент командной строки. Если вам нужно трубы строку в скрипт Баш, еще несколько работ необходимо:

import subprocess 
import io 
import tempfile 

uid = str(uid[0]) + str(uid[1]) + str(uid[2]) + str(uid[3]) 

f = tempfile.TemporaryFile(mode='w+t') 
f.write(uid) 
f.seek(0) 

result = subprocess.run(['check.sh', uid], stdin=f, stdout=subprocess.PIPE) 

f.close() 

print(result.stdout) 

Читать https://docs.python.org/3/library/subprocess.html для дальнейшего проникновения в суть.

Интерфейс немного изменился, поэтому имейте в виду вашу версию Python. 2.x работает иначе, чем 3.4, чем 3.5. Однако есть совместимые способы.

+0

Я просто попробовал это сейчас и не работал, im использовал python 2 и использовал subprocess.call, для тестирования у меня есть сценарий bash, который делает «echo $ 1 >> log.txt» после того, как я запускаю код, который он только создает пустая строка в log.txt, поэтому скрипт bash не получает строку. Вот что моя команда, выполняющая сценарий bash, выглядит так: subprocess.call (["./ Rfid.sh", "uidu"], shell = True) uidu - это переменная с uid (в строке выше этого я сделал print uidu и он работает) –

+0

@UrosSimic: Мой плохой ... Кавычки были неправильными. 'uidu' в списке аргументов, без quores.If это переменная bash, она должна быть' '$ uidu''. Тем не менее, в вашем файле должна быть строка uodu, а не пустые строки. Если он не работает, попробуйте использовать 'shell = False' – steffen