Подпроцесс Racket не находит файлы - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь запустить файл Racket из консоли как часть развертывания. Частично это компилирует файлы с помощью pandoc. У меня есть команда, которая работает, когда я вызываю ее непосредственно из консоли, но она не работает, когда я вызываю ее из Racket.

Успешная команда:

pandoc example.md -H pandoc.css

Это дает мне предупреждение о том, как я должен включить заголовок в файл HTML, но затем он выплевывает некоторый HTML в стандартный вывод.

Код Racket выполняет три вызова и отображает выходные данные для stdout и stderr для каждого вызова. Это немного громоздко, поэтому код будет внизу. Здесь я просто помещу звонки, которые он делает, и результаты.

> /bin/ls ./
> /usr/bin/pandoc example.md
> /usr/bin/pandoc example.md -H pandoc.css

стандартный вывод из первых двух:

example.md
pandoc.css
pandoc.rkt

<h1 id="first-section">First Section</h1>
<p>This is an example markdown file.</p>

stderr для третьего:

pandoc: example.md -H pandoc.css: openBinaryFile: does not exist (No such file or directory)

Любой ключ к пониманию того, почему он может найти example.md, но не может найти pandoc.css?

Вот полный код для pandoc.rkt. Я впервые использую порты в Racket, поэтому, если я делаю что-то ужасным образом, не стесняйтесь, дайте мне знать.

#lang racket

(define-values (ls out1 in1 err1)
  (subprocess #f #f #f "/bin/ls" "./"))
(subprocess-wait ls)
(define files (port->lines out1))
(define error (port->lines err1))
(display files) (display "\n")
(display error) (display "\n")

(close-input-port out1)
(close-output-port in1)
(close-input-port err1)

(define-values (pandoc out2 in2 err2)
  (subprocess #f #f #f "/usr/bin/pandoc" "example.md"))
(subprocess-wait pandoc)
(define html (port->lines out2))
(set! error (port->lines err2))
(display html) (display "\n")
(display error) (display "\n")

(close-input-port out2)
(close-output-port in2)
(close-input-port err2)

(set!-values (pandoc out2 in2 err2)
  (subprocess #f #f #f "/usr/bin/pandoc" "example.md -H pandoc.css"))
(subprocess-wait pandoc)
(set! html (port->lines out2))
(set! error (port->lines err2))
(display html) (display "\n")
(display error) (display "\n")

(close-input-port out2)
(close-output-port in2)
(close-input-port err2)

1 Ответ

2 голосов
/ 06 апреля 2019

Существует несколько аргументов: example.md, -H и pandoc.css.Поэтому вы должны разделить их в соответствии с документацией .

То есть вместо:

(subprocess #f #f #f "/usr/bin/pandoc" "example.md -H pandoc.css")

Использование:

(subprocess #f #f #f "/usr/bin/pandoc" "example.md" "-H" "pandoc.css")

Примечаниечто это также верно для subprocess некоторых других языков (например, Python ).

...