【问题标题】:why would jsmin quit early when run in a python subprocess?为什么jsmin在python子进程中运行时会提前退出?
【发布时间】:2012-04-19 20:53:52
【问题描述】:

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

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

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

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

这是我的子流程调用:

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

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

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

【问题讨论】:

  • 你是说jsmin &lt;jsfile &gt;jsfile.min 命令在直接从shell 运行时工作正常吗?这很奇怪,因为os.system() 派生了一个 shell,所以 jsmin 的执行环境在两种情况下应该几乎相同。
  • 是的,这就是我要说的。我什至尝试创建一个运行 jsmin 的 shell 脚本,该脚本以 shebang thingy 开头。该 shell 脚本可以在终端上运行,但不能在 python 上运行。什么?
  • 我尝试将环境从 shell 脚本写入文件,以查看是否可以检测到从 python 子进程运行它与从 shell 运行它之间的任何环境差异。唯一的区别是 SHLVL=4 而不是 3,而且 PWD 也不同。就是这样,其他的都一样。
  • 我也尝试使用 python -u 运行 python 程序,以防万一涉及一些 python 缓冲问题,但这没有任何影响。
  • 尝试在您的os.system() 调用中将jsmin 更改为cat,如果输出文件与输入文件相同,那么罪魁祸首就是您的jsmin 二进制文件。否则,您的 Python 安装会出现一些异常现象。

标签: python subprocess stdout jsmin


【解决方案1】:

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

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

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

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

with open(targetpath, 'w+') as targetfile:
   ..code that writes to targetfile

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 2012-09-28
    • 1970-01-01
    • 2011-01-25
    • 2014-08-24
    • 1970-01-01
    • 2021-10-31
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多