2

我已经下载并编译了 jsmin.c,并在终端的 javascript 文件上运行它,它似乎工作得很好。但是当我从 python 脚本中的 os.system() 或 os.popen() 调用中调用它时(在同一个输入文件上),输出文件(js 文件的缩小版本)被截断,就好像 stdout 是在子进程退出之前没有被刷新,或者好像 jsmin 提前终止了,或者好像磁盘缓冲发生了什么事情。

但这些事情似乎都不是这样。退出值是我从 main() 返回的任何值,即使输出被截断,添加对 fflush(stdout) 的调用没有任何区别,并且在调用 jsmin 后从同一个子 shell 中调用 sync 不会使任何区别。

我尝试用对 fputc() 的调用替换对 putc() 的调用,起初它似乎解决了问题(出于某种深不可测的原因?),但随后,莫名其妙地,问题又开始发生,现在可靠地发生了。离奇?

我会说这是 jsmin.c 的一些问题,但是当从命令行运行时,该程序在同一个输入文件上运行良好,因此它与从 python 子进程运行它有关。

这是我的子流程调用:

result = os.system('jsmin < ' + tpathname + ' > ' + tpathname + '.min')

(我已将 jsmin 放在路径中,并且它正在运行,我在 .min 文件中获得了大部分预期结果。)

谁能想象导致这个问题的原因是什么?

4

1 回答 1

0

Stack Overflow 不会让我在 5 个小时或类似的时间内回答我自己的问题,所以这个“答案”最初是作为编辑添加的。(它也不让我聊天,所以评论延伸了一点。)

我发现了问题。问题出在为 jsmin 创建输入文件然后在其上调用 jsmin 的 python 程序上。它正在创建一个文件,但未能关闭它(还),然后在其上调用 jsmin。所以 jsmin 没有提前终止,也没有截断它的输出;相反,它在(迄今为止)不完整的输入文件上运行。(呃。)

我会比我更早意识到这一点,除了 python 程序最终会关闭 jsmin 的输入文件(通过退出),所以当我检查它时,它看起来已经完成了。只是在 jsmin 处理它时它还没有完成。

这正是“with”成语的动机之一:

with open(targetpath, 'w+') as targetfile:
   ..code that writes to targetfile
于 2012-04-22T21:34:43.093 回答