【问题标题】:os.system to subprocess.Popen or subprocess.callos.system 到 subprocess.Popen 或 subprocess.call
【发布时间】:2015-05-20 06:51:11
【问题描述】:

我有一个如下函数,当我在 CMD 中执行我的 python 代码时它工作正常(SIMT 是一个可执行文件)。但是,当我使用 py2exe 构建可执行文件时,shell 窗口会迅速出现和消失。所以我搜索并发现我可以使用带有creationflags = 0x08000000的subprocess.popen。但它不起作用。

这是我的功能

def Kill(SIMT):
  outfile1 = open('Kill.txt', 'w')
  outfile1.write('Kill' + '\r\n')
  outfile1.write('x')
  outfile1.close()
  os.system("type Kill.txt | testclient p . " + SIMT)
  os.remove('Kill.txt')

我将 os.system 替换为:

  subprocess.Popen(["type Kill.txt | testclient p . ", SIMT], creationflags= 0x08000000, shell=True).communicate()

另外,我需要 shell=True 吗?

【问题讨论】:

  • 如果你改为运行 Popen(['testclient', 'p', '.', SIMT], stdin=PIPE, universal_newlines=True).communicate('Kill\nx') 会发生什么?
  • 我应该放 Kill.txt 而不是 PIPE 吗? Popen(['testclient', 'p', '.', SIMT], stdin=Kill.txt, universal_newlines=True) ,.communicate('Kill\nx') 是做什么的?我不应该有creationflags= 0x08000000吗?
  • 你在我的评论中看到 Kill.txt 了吗?
  • NameError:未定义全局名称“PIPE”。哦,你的意思是 subprocess.PIPE
  • 请勿使用PIPE 和/或communicate(),除非您想为子流程提供输入或获取其输出。 start 是一个内部 shell 命令。它需要外壳。如果os.system('start ...') 对您不起作用,请提出一个单独的问题:确保描述您期望发生什么以及会发生什么。包括示例输入/输出和完整的回溯(如果有)。

标签: python subprocess os.system


【解决方案1】:

如果你想让 shell 为你安排管道,你需要 shell=True 并且第一个参数是一个字符串,就像你为 os.system 设置的那样,不是列表。对于shell=False,列表意味着执行作为列表的第一项给出的程序,其他项作为它的命令行参数;所以您不能让第一项包含| 并期望外壳程序代表您安排该管道。

您的替代方法是自己安排“管道”或其等效项 - 例如,这里可能最简单,只需在 Kill.txt 上打开一个文件对象作为 subprocess.Popen 的标准输入 (stdin=)执行testclient(我相信type 只会将文件读到标准输出,所以对于这个特定的用例应该足够了)。

【讨论】:

  • 我应该这样写吗? `subprocess.Popen(['testclient', 'p', '.', SIMT], stdin=subprocess.PIPE, universal_newlines=True) .communicate('Kill\nx') 我不应该有creationflags = 0x08000000吗?这样我就不需要创建 Kill.txt。
  • 你能帮我找到这个 os.system 的替换命令吗("START " + S3_LOC + texe + " -p " + Floc[1] + " -f no -f no - f no -w " + S3_LOC),这是正确的吗? subprocess.Popen(['START', S3_LOC, texe, '-p', Floc[1], '-f no -f no -f no -w', S3_LOC], stdin=subprocess.PIPE).communicate()
  • @user3261772,不,这不可能是正确的,因为不涉及 shell,没有人会代表你“分割空格”,所以在列表的末尾你需要 @ 987654330@.
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2018-01-14
  • 2011-06-16
  • 2018-04-30
  • 2011-09-07
  • 2019-03-23
相关资源
最近更新 更多