【问题标题】:Python os.system: Order of commandsPython os.system:命令顺序
【发布时间】:2018-05-26 15:39:20
【问题描述】:

为什么用内容调用文件a.py

import os
print('Hi')
os.system('cat a.py')

产生以下输出,我怎样才能让它们以正确的顺序打印?

$ python a.py
import os
print('Hi')
os.system('cat a.py')
Hi

您会看到cat 命令在print 之前打印到标准输出。在 Windows 10 上的 GitBash 中运行 Python 3.6 时发生。不会在 Ubuntu 17.10 上的 Python 3.6 中发生。


注意: 我知道我可以很容易地用file.readlines() 之类的东西打印文件的内容。这只是一个简单的例子。然而,当运行更复杂的事情时,了解为什么会发生这种情况以及如何解决它会变得很重要

【问题讨论】:

  • 你为什么不使用subprocess.Popen ?不应使用os.systemsubprocess.Popen 的行为保证在所有操作系统中都是相同的
  • @user1767754:子进程的行为并没有什么不同。

标签: python python-3.x git-bash python-os


【解决方案1】:

这是一种更清洁的方式。

from subprocess import check_output  
print check_output(['cat', 'a.py'])

【讨论】:

  • 这不会改变任何事情。
  • 所以你的意思是,这会产生相同的结果?
  • 除非它出于某种原因对 Python 脚本的输出缓冲做一些事情,否则它将产生与 os.system 代码相同的结果。
【解决方案2】:

输出被缓冲。您必须刷新此缓冲区:

import os
import sys
print('Hi')
sys.stdout.flush()
os.system('cat a.py')

【讨论】:

  • 你不能也打电话给python -u 以获得无缓冲吗?
  • 您能否解释一下为什么它可以在 Ubuntu 上运行而无需刷新?
  • 通常,在标准输出连接到终端的情况下,输出将被行缓冲(因此行终止符会导致Hi 输出被自动刷新),但 Git Bash 可能会改变一些事情。
  • 好的,可能已经猜到它与 GitBash 有关。这就是我使用 Windows 所得到的! :D
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 2016-10-17
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多