【问题标题】:How to prevent subprocess.popen to "get lost" in Windows?如何防止 subprocess.popen 在 Windows 中“迷路”?
【发布时间】:2012-01-16 15:56:21
【问题描述】:

我有一个奇怪的 Python(3.x) 问题:
基本上我只想创建一个计时器,它在预定义的时间调用外部程序(.exe) - (简化如下,另外还有一个倒计时输出):

time.sleep(y)
x=popen("pathto.exe")

如果我测试我的代码,一切都完全按照我想要的方式工作,但仅适用于小 y。对于大 y(等待超过几个小时),Python 不执行 popen 命令(但也没有任何错误)。 popen 命令之后的任何其他“正常”代码(例如我的电子邮件通知)都可以正常工作。

我不完全确定这是 Windows(我在 64 位 Windows 7 上工作,禁用了我知道的所有节能功能)还是 Python 问题,但到目前为止找不到解决方案:
我为 popen 尝试了几个额外的参数(Shell/no Shell 等),并尝试在等待期之前打开程序/定义 X,然后再次关闭它,但不幸的是没有解决这个问题。

非常感谢!

编辑:更详细的代码示例:

while 1:
    if time.mktime(trade2)<=time.time():

        break

    else:
        dif=time.mktime(trade2)-time.time()  # this is just for a visible countdown
        aus=time.gmtime(dif)
        sys.stdout.flush()
        print("\b\b\b\b\b\b\b\b\b", end="\r")
        print(aus[3],aus[4],aus[5], sep=":",end="")
        time.sleep(0.5)

x=subprocess.Popen("c:/xyz/abc.exe")
print("Sending Mail...")

print() 总是按预期执行,Popen 仅在倒计时少于大约 1-2 小时时执行。

【问题讨论】:

  • 我假设你的意思是time.sleep()?
  • 如果将 popen 调用替换为 print 会发生什么?
  • 使用打印(和任何其他“内部”命令),一切都按预期工作......正如我所说,在 popen 命令之后,我有一些代码可以发送确认邮件 - 甚至可以完美运行如果“睡眠时间”很长。 popen 命令似乎被跳过了...
  • 可能有一些代码告诉程序“保持活动状态”(防止任何 Windows Idle 措施?)并为调用外部程序保留内存可能是一个解决方案? (但通常总有足够的可用内存,没有内存泄漏..)

标签: python windows-7 subprocess exe popen


【解决方案1】:

睡眠没有保证的唤醒时间。 According to the docs sleep 的持续时间可能比请求的时间长或短。我之前在 SO 上 answered 这个问题,还有其他选择。

【讨论】:

  • 但是时间绝对不是问题。正如我所写,除了“popen”之外的所有其他代码都可以正常工作,并且在睡眠到期时执行! - 编辑:事实上,我在循环中使用了一个较短的睡眠命令,所以上面的描述只是为了缩短对我的问题的解释 - 抱歉。
  • @jpdus popen 很难使用。重新阅读文档,并确保您的所有标志都已正确设置。还要检查您使用的是哪个版本的 popen。最后,查看envoy 以获得更简单的子流程功能。
  • 如上所述,我已经尝试了几乎所有记录在案的标志(buffersize、close_fds、shell),但问题仍然存在。如果睡眠时间很短但经过很长一段时间后,Python 似乎可以无法调用外部程序...如果特使只是一个子流程包装器,我怀疑它是否会有所帮助,因为我真的不需要与子流程进行任何交互,我只需要调用程序。
  • @jpdus popen 只是启动一个子进程。它不与它交互,甚至不等到它完成。那么你怎么知道这个进程是否在用很短的计时器做任何事情呢?
  • 好吧,我只是尝试打开另一个程序(通过 .exe 文件的路径)。使用短定时器,程序完全按照我想要的方式打开,使用长定时器,popen 命令只是被跳过(但定时器之后的所有其他代码都像以前一样工作)。抱歉,如果不够清楚。
猜你喜欢
  • 1970-01-01
  • 2022-10-17
  • 2021-01-31
  • 2011-03-15
  • 2014-06-07
  • 2014-10-28
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多