【问题标题】:python subprocess.Popen throwing error while after a Thread is activatedpython subprocess.Popen在激活线程后抛出错误
【发布时间】:2021-10-31 07:37:27
【问题描述】:

我环顾四周,但没有看到有关此特定问题的任何信息,所以我想在这里问一下:

每当我在启动随机线程后尝试运行 subprocess.Popen 调用时,都会收到 OSError。我的假设是 subprocess.py 的某些方面我不了解与多线程相关的内容。

我在 QNX 系统上运行 python 2.7.3。

代码测试:

import subprocess
import time
from threading import Thread

def Test():
  while(1):
     print "Testing."
     time.sleep(1)

if __name__=="__main__":
   subprocess.Popen('ls') # runs just fine

   Thread(target=Test).start()

   subprocess.Popen('ls') # throws OSError

追溯

Traceback (most recent call last):
   File "test.py", line 16 in <module>
      subprocess.Popen('ls')
   File "usr/local/lib/python2.7/subprocess.py", line 679, in __init__
      errread, errwrite)
   File "usr/local/lib/python2.7/subprocess.py", line 1143, in _execute_child
      self.pid = os.fork()
OSError: [Errno 89] Function not implemented

【问题讨论】:

  • 这似乎是操作系统特定的问题。您是否尝试过先评论Popen() 电话?
  • @OlvinR​​oght 是的,它会产生同样的错误。
  • multiprocessing 你可以change start method 来“生成”。看看吧。
  • @OliveRoght 这仅适用于 Python 3.4 及更高版本。

标签: python subprocess qnx


【解决方案1】:

QNX 并非设计为在进程已经产生新线程后支持进程内的fork()。来自 QNX 文档...

假设您有一个进程并且尚未创建任何线程(即,您正在使用一个线程运行,即调用 main() 的那个)。当您调用 fork() 时,会创建另一个进程,同样使用一个线程。这是一个简单的案例。

现在假设在您的进程中,您调用了 pthread_create() 来创建另一个线程。当您调用 fork() 时,它现在将返回 ENOSYS(表示该函数不受支持)!为什么?

不管你信不信,这与 POSIX 兼容——POSIX 说 fork() 可以返回 ENOSYS。实际情况是这样的:目前还没有构建 Neutrino C 库来处理带有线程的进程的分叉。当您调用 pthread_create() 时,该函数会设置一个标志,实际上是在说:“不要让这个进程 fork(),因为我还没准备好处理它。”然后,在库 fork() 函数中,检查此标志,如果设置,则导致 fork() 返回 ENOSYS。

source,阅读Process creation and threads 部分。)

我假设Thread(target=Test).start() 调用pthread_create() 并说明您看到的错误。

另外值得注意的是ENOSYS的定义还指定了未实现的功能。请参阅以下定义...

ENOSYS Function not implemented (POSIX.1-2001).

(source)

因此,这是操作系统级别的限制。 Python 不是问题!

【讨论】:

  • 非常感谢。我有点困惑。
  • 当然!很高兴为你减少一些不确定性~
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多