球拍的子流程找不到文件

时间:2019-04-05 21:03:32

标签: racket

我正在尝试从控制台运行Racket文件,作为部署的一部分。其中一部分是使用pandoc编译文件。当我直接从控制台调用它时,我有一个命令可以使用,但是从Racket中调用它时,它不起作用。

成功的命令:

pandoc example.md -H pandoc.css

这给了我一个警告,告诉我应该如何在HTML文件中包含标题,但随后它会将一些HTML吐出到stdout。

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 个答案:

答案 0 :(得分:2)

有几个参数:example.md-Hpandoc.css。因此,您应该根据documentation对其进行分隔。

也就是说,代替:

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

使用:

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

请注意,其他几种语言(例如Python)的subprocess也是如此。