多处理 ImportError:没有名为 <input> 的模块

我正在使用 Windows 机器,并且我有一个为 Python 2.7 设计的代码,可以解决统计模型。由于模型取决于参数的值,因此我创建了一个并行版本,它为每个参数值求解一个模型。


例如,考虑一个名为的第一个文件main_function,其中包含以下代码(此代码是为了可复制性,但与问题无关):


import numpy as np

import cvxpy


def lm_lasso(x, y, lambda1=None):

    n = x.shape[0]

    m = x.shape[1]

    lambda_param = cvxpy.Parameter(sign="positive")

    # Define the objective function

    beta_var = cvxpy.Variable(m)

    lasso_penalization = lambda_param * cvxpy.norm(beta_var, 1)

    lm_penalization = (1.0 / n) * cvxpy.sum_squares(y - x * beta_var)

    objective = cvxpy.Minimize(lm_penalization + lasso_penalization)

    problem = cvxpy.Problem(objective)

    beta_sol_list = []

    for l in lambda1:

        lambda_param.value = l

        problem.solve(solver=cvxpy.ECOS)

        beta_sol = np.asarray(np.row_stack([b.value for b in beta_var])).flatten()

        beta_sol_list.append(beta_sol)

    return beta_sol_list

第二个名为的文件parallel_function包含以下代码:


import multiprocessing as mp

import numpy as np

import functools

import zz_main_function as mf


def lm_lasso_parallel(x, y, lambda1):

    chunks = np.array_split(lambda1, mp.cpu_count())

    pool = mp.Pool(processes=mp.cpu_count())

    results = pool.map(functools.partial(mf.lm_lasso, x, y), chunks)

    pool.close()

    pool.join()

    return results

我将函数拆分为两个文件的原因是因为这样一切似乎都可以正常工作,而无需添加if __name__ == '__main__':处理多处理时通常所需的内容。


这段代码是几个月前编写的,无论是从 python 控制台还是运行 python 文件,都可以完美运行,例如:


import zz_parallel_function as pf

from sklearn.datasets import load_boston


boston = load_boston()

x = boston.data

y = boston.target

lambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]


r_parallel = pf.lm_lasso_parallel(x, y, lambda1)

最近我不得不格式化我的电脑,当我重新安装 python 2.7 并尝试运行之前描述的代码时,我遇到了以下错误:


如果我尝试直接从 python 控制台运行它:


import zz_parallel_function as pf

from sklearn.datasets import load_boston


boston = load_boston()

x = boston.data

y = boston.target

lambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]


r_parallel = pf.lm_lasso_parallel(x, y, lambda1)

http://img2.mukewang.com/629872a20001a19506680136.jpg

  1. 如果我将其作为独立文件运行:

http://img3.mukewang.com/629872b30001578409970707.jpg

所以我的问题是:

  1. 为什么这段代码以前有效,现在无效?(可能)唯一改变的是安装的一些模块的版本,但我认为这无关紧要

  2. 关于如何让它再次工作的任何猜测?


噜噜哒
浏览 132回答 1
1回答

一只萌萌小番薯

您不能mulitprocessing直接从 python 解释器生成新的子进程。从文档中,注意:此包中的功能要求&nbsp;子模块可以导入主模块。这在编程指南中有介绍,但值得在这里指出。这意味着某些示例,例如 Pool 示例将无法在交互式解释器中工作。指导方针说安全导入主模块确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如启动新进程)。在 Windows 以外的任何操作系统上调用时,调用 freeze_support() 均无效。另外,如果模块在 Windows 上被 Python 解释器正常运行(程序没有被冻结),则 freeze_support() 无效。此外,应使用if __name__ == '__main__':以下方式保护程序的“入口点”:from multiprocessing import Process, freeze_supportdef f():&nbsp; &nbsp; print 'hello world!'if __name__ == '__main__':&nbsp; &nbsp; freeze_support()&nbsp; &nbsp; Process(target=f).start()如果freeze_support()省略该行,则尝试运行冻结的可执行文件(例如,使用pyinstalleror创建py2exe)将引发RuntimeError。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python