Зарегистрируйте и stdin и stdout программы

[112408]У меня есть быстрое решение, которое полезно много раз. Обратите внимание, что оно предназначено только для личного пользования(1); его можно доработать, добавить редактирование на месте, контроль ошибок, что угодно. Но я думаю, что оно тоже полезно. Идея заключается в использовании самой нумерации LaTeX.

Итак, во-первых, вам нужно добавить метки к вашему документу (что, тем не менее, хорошо):

Далее запустите латекс, как всегда, допустим, он называется [112709]walla.tex[112710]. Теперь вы запускаете этот маленький питоновый скрипт:

Вызовите его [112711]find_tex_labels[112712], сделайте его исполняемым, и запустите его как [112713]find_tex_labels walla > walla_annotated.tex[112714] (обратите внимание, в аргументах нет расширений).

  • На выходе у вас будет аннотированный LaTeX-файл:

    • ...это сработает для всех меток. Я нахожу это довольно полезным для перекрестных ссылочных уравнений и т.д., когда я редактирую на устройстве, в котором нет LaTeX. Теперь вы можете заменить оригинальный walla.tex на новый.
    • Это ваша обязанность - синхронизировать все вещи... и нигде не использовать комментарии "%%% label".
    • Сноски:
  • (1) Я обещаю доработать его много раз. Затем, учитывая, что я единственный, кто его использует, я исправляю ошибки, если и когда они появляются... и никогда не нахожу времени, чтобы их почистить. [112428]

2
17.04.2015, 10:47
3 ответа

В итоге я взломал эту штуку вместе:

import subprocess
import time
import sys

log = open(sys.argv[3], 'w')

input = open(sys.argv[2], 'r')

p = subprocess.Popen([sys.argv[1]], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

def readAllSoFar(proc, retVal=''):
  while (subprocess.select.select([proc.stdout],[],[],0)[0]!=[]):
    retVal+=proc.stdout.read(1)
  return retVal

while True:
    print('starting loop')
    line = input.readline()
    print('read line ' + line)
    if not line:
        print('breaking')
        break

    print('before sleep1')
    time.sleep(0.1)
    print('before readAllSoFar')
    output = readAllSoFar(p)
    print('got output' + output)
    log.write(output)
    time.sleep(0.1)
    log.write(line)
    p.stdin.write(line)

Запустите его с python runner.py ./program_to_run input.txt output.txt

Предполагается, что вывод команды будет производиться за десятые доли секунды.

0
27.01.2020, 22:55

У вас уже есть журнал stdin: это ваш файл.

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

0
27.01.2020, 22:55

Комбинация клавиш yd затянет текущий путь к каталогу в буфер обмена. Это сопоставление клавиатуры определяется в файле .vimrc по умолчанию, включенном в пакет vifm. Необходимо установить xclip , в противном случае предварительно определенное сопоставление не будет работать.

-121--186988-

Работает для меня с GNU sed (версия 4,2,1):

$ echo -ne $'\u9991' | sed 's/\xe9\xa6\x91//g' | hexdump -C
$ echo -ne $'\u9991' | hexdump -C
00000000  e9 a6 91

(В качестве еще одной замены sed можно также использовать GNU awk ; но это не кажется нужным.)

-121--13205-

Это, вероятно, не самое красивое решение, но вы можете сделать что-то вроде:

cat file.txt | tee -a stdin.txt | ./program | tee -a stdout.txt

Вы можете использовать один и тот же файл в обоих тройниках, но ваши входные и выходные данные могут быть искажены и нечитаемы.

0
27.01.2020, 22:55

Теги

Похожие вопросы