【问题标题】:Can Python version message be suppressed for child processes (Windows)?可以为子进程(Windows)抑制 Python 版本消息吗?
【发布时间】:2020-06-16 10:28:21
【问题描述】:

我正在使用multiprocessing计算大量数据;即我定期生成一个进程,以便进程总数等于我机器上的 CPU 数量。 我会定期打印出整个计算的进度……但这不方便地穿插着 Python 的每个孩子的欢迎信息! 需要明确的是,由于多处理的处理方式,这是一个 Windows 特定问题

例如

> python -q my_script.py

Python Version: 3.7.7 on Windows

然后打印相同版本消息的许多后续副本;每个子进程一个。 我怎样才能抑制这些?

我了解,如果您在命令行中使用 -q 标志运行 Python,则会抑制欢迎消息;虽然我不知道如何将其翻译成我的脚本。

编辑:

我尝试像这样包含解释器标志-q

multiprocessing.set_executable(sys.executable + ' -q')

还是无济于事。我收到了FileNotFoundError,它告诉我由于它们检查参数的方式,我无法以这种方式传递选项。

不管怎样,这里是相关的代码部分(它是一个完整的函数):

def _parallelize(self, buffer, func, cpus):
    ## Number of Parallel Processes ##
    cpus_max = mp.cpu_count()
    cpus = min(cpus_max, cpus) if cpus else int(0.75*cpus_max)

    ## Total Processes to-do ##
    N = ceil(self.SampleLength / DATA_MAX)  # Number of Child Processes
    print("N: ", N)
    q = mp.Queue()  # Child Process results Queue

    ## Initialize each CPU w/ a Process ##
    for p in range(min(cpus, N)):
        mp.Process(target=func, args=(p, q)).start()

    ## Collect Validation & Start Remaining Processes ##
    for p in tqdm(range(N)):
        n, data = q.get()  # Collects a Result

        i = n * DATA_MAX  # Shifts to Proper Interval

        buffer[i:i + len(data)] = data  # Writes to open HDF5 file

        if p < N - cpus:  # Starts a new Process
            mp.Process(target=func, args=(p + cpus, q)).start()

第二次编辑:

我应该提一下,我在 anaconda 环境中做所有事情。

【问题讨论】:

  • 你是如何生成一个子进程来打印欢迎信息的?
  • 也许重新定义指向 python exe 的环境变量,因为 python -q 会起作用?可以试试吗?
  • 如果您编辑您的问题并添加相关代码 sn-p 在您确切生成进程的位置,这将非常有帮助。通常,您可以填写 args=(...,) 之类的内容。但是如果不看看你到目前为止做了什么,就很难猜到。
  • 这看起来你正在重写multiprocessing.Pool。您不使用它有什么特别的原因吗?
  • @AronLloyd 尽管Pool 工作人员通常会返回他们处理过的数据,但没有什么可以阻止他们将数据写入磁盘。例如,有时我让工作人员只返回他们处理过的项目的名称/编号的 2 元组和一个 bool 以指示它是否已成功处理。处理后的数据本身直接写入磁盘。

标签: python windows python-multiprocessing


【解决方案1】:

消息在交互式启动时打印。

衍生进程确实从子进程继承了一些标志。 但是查看multiprocessing 中的代码,似乎无法在程序中更改这些参数。

因此,摆脱消息的最简单方法应该是将-q 选项添加到启动程序的原始python 调用中。 我已经确认 -q 标志是继承的。

所以这应该抑制原始进程及其产生的子进程的消息。

编辑: 如果您查看set_executable 的实现,您会发现无法以这种方式添加或更改参数。 :-(

编辑2: 你写道:

我在 anaconda 环境中做所有事情。

您是指虚拟环境,还是某种花哨的 IDE,例如 spyder?

如果您曾经遇到过 Python 问题,请先尝试在 plain CPython 中重现它,从命令行运行。 IDE 和像 anaconda 这样的高级环境在运行 Python 时有时会做一些奇怪的事情。

【讨论】:

  • 我没有使用交互模式(这意味着要么在没有脚本的情况下运行 python,要么传递 -i 标志)。我也试过这个:来自命令行的python -q myscript.py。它似乎对你有用,我在做一些不同的事情吗?感谢您抽出宝贵时间!
  • 我的电脑运行的是 FreeBSD UNIX 而不是 ms-windows,所以我没有这个问题。这特定于 multiprocessing 在 ms-windows 上的工作方式。
猜你喜欢
  • 2013-08-04
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多