python - 为什么 jsmin 在 python 子进程中运行时会提前退出?

标签 python subprocess stdout jsmin

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

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

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

我会说这是 jsmin.c 的一些问题,但是当从命令行运行时程序在同一个输入文件上工作正常,所以它与从 python 子进程运行它有关。

这是我的子流程调用:

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

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

谁能想象是什么导致了这个问题?

最佳答案

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

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

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

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

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

关于python - 为什么 jsmin 在 python 子进程中运行时会提前退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10236606/

相关文章:

python - 如何在python子进程中由另一个用户运行文件

python - 有什么方法可以为二元决策图重新排序变量?

python - re.scanner 只搜索字符串的开头

python - 如何快速用字典识别列表中的重复数字

python - 编写 GIMP python 脚本

更改 stdout 的文件位置指示符

python - 汇总分组 Pandas 数据框中的行并返回 NaN

Python子进程,给子进程一个输入

redirect - 如何将Kotlin stdio重定向到文件?

python - 关于管道 stdio 和 subprocess.Popen