Мне интересно встраивать скрипты bash и python. Основная идея заключается в том, что вывод моих команд bash служит для ввода в python.
У меня есть набор zip файлов, которые я хочу уменьшить размер, выбирая фрагмент данных. Дело в том, что bash может распаковывать и обрабатывать большой файл намного быстрее, чем python.
channel="Channel_08"
channelafter="Channel_10"
source=/Home/linux/test/*.zip
destination=/home/linux/test2
for file in $source
do filename=$(basename $file); eval "head -\$((\$(unzip -c \$file | grep -n \$channelafter |cut -f1,1 -d':')-8)) <(unzip -c \$file)|tail -\$((\$(unzip -c \$file | grep -n \$channelafter |cut -f1,1 -d':')-\$(unzip -c \$file|grep -n \$channel |cut -f1,1 -d':')))" > $destination/"$filename".txt; echo "$filename".txt
done
Результирующие файлы имеют гораздо меньший размер и только имеют выбранные данные с канала на channel_after.
Теперь мне нужно запустить скрипт python, который вместо записи вывода в> $destination/"$filename".txt
я могу использовать его для чтения и обработки данных. Этот скрипт будет запускаться каждый день автоматически с помощью DAEMON
class App():
def __init__(self):
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
self.pidfile_path = '/tmp/foo.pid'
self.pidfile_timeout = 5
def run(self):
while True:
#process = psutil.Process(os.getpid())
#print(process.memory_info().rss)
routine()
print("Running")
time.sleep(3600*24)
def routine():
for line in $filename:
df.iloc[count] = line
count +=1
Имейте в виду, что мой python установлен на windows, но мне все равно нужно запустить команды bash.
Узнайте о символе трубы в программировании оболочки. Как и в командной строке, вы можете связывать команды с | так что выход левой стороны принимается как вход с правой стороны.
Поэтому вместо перенаправления > $destination/"$filename".txt
вы можете |/path/to/python-script.py
|/path/to/python-script.py
.
Теперь все, что отправлено на stdout левой частью, можно прочитать с stdin с правой стороны. В зависимости от того, что у вас есть справа (это может быть исполняемая программа или скрипт), у вас могут быть определенные способы сказать, чтобы читать это из stdin.
import subprocess
filenames = subprocess.check_output("./shellscript.sh", shell=True).decode() # Decode to convert bytes to str
filenames = filenames.split('\n') # or whatever the splitter eg. space.
for line in filenames:
# your logic
echo $?
после запуска скрипта из терминала
unzip
. Насколько я вижу, вы не используете bash I / O.