БАШ и ПИТОН

1

Мне интересно встраивать скрипты 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.

  • 0
    «bash может распаковать и обработать большой файл намного быстрее, чем python » - у Bash нет возможности распаковать, это делает внешняя программа unzip . Насколько я вижу, вы не используете bash I / O.
Теги:
python-3.x
zip

2 ответа

0
Лучший ответ

Узнайте о символе трубы в программировании оболочки. Как и в командной строке, вы можете связывать команды с | так что выход левой стороны принимается как вход с правой стороны.

Поэтому вместо перенаправления > $destination/"$filename".txt вы можете |/path/to/python-script.py |/path/to/python-script.py.

Теперь все, что отправлено на stdout левой частью, можно прочитать с stdin с правой стороны. В зависимости от того, что у вас есть справа (это может быть исполняемая программа или скрипт), у вас могут быть определенные способы сказать, чтобы читать это из stdin.

  • 0
    Но я хочу объединить все в своем скрипте Python. Может ли это быть?
2
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
  • 0
    CalledProcessError: Команда './script.sh' вернула ненулевой статус выхода 1. Почему это так?
  • 0
    Это проблема с вашим сценарием оболочки; это означает, что ваш сценарий оболочки не работает успешно, попробуйте запустить его по отдельности и посмотреть, завершается ли он с нулевым echo $? после запуска скрипта из терминала

Ещё вопросы

Сообщество Overcoder
Наверх
Меню