【问题标题】:IPython-IPyparallel import errorIPython-IPyparallel 导入错误
【发布时间】:2016-03-02 07:32:57
【问题描述】:

我已将所有代码复制到我所有引擎机器上的工作目录中。我的代码是:

my_test.py
my_startegy.py
main.py

所以,main.py 将在 Client Machine 上运行,main.py 中的代码是:

from ipyparallel import Client

import my_test
import my_strategy as strategy


class Beck_Test_Parallel(object):
    """
    """
    def __init__(self):
        self.rc = None
        self.dview = None

    def start_client(self, path):
        self.rc = Client(path)
        self.dview = self.rc[:]
        #self.dview.push(dict(
        #        Account=my_test.Account, 
        #        dataImport=my_test.dataImport
        #    ))

    def parallel_map(self, deal_function, accounts):
        import my_test
        return self.dview.map_sync(deal_function, accounts)

def create_accounts(time_list, account):
    accounts = []
    for index, time in enumerate(time_list):
        acc = my_test.Account(
                strategy.start, 
                strategy.end, 
                strategy.freq,
                strategy.universe_code, 
                strategy.capital_base, 
                strategy.short_capital, 
                strategy.benchmark, 
                strategy.self_defined
            )
        account.share_data(acc)
        acc.iniData2()
        acc.iniData3()
        acc.current_time = time
        acc.days_counts = index+1
        acc.dynamic_record['capital'] = acc.capital_base
        del acc.connect
        accounts.append(acc)
    return accounts

def let_us_deal(account):
    account =  strategy.handle_data(account) 
    print '   >>>', account.current_time
    return account


if __name__ == '__main__':
    account = my_test.Account(
            strategy.start,
            strategy.end,
            strategy.freq,
            strategy.universe_code,
            strategy.capital_base,
            strategy.short_capital,
            strategy.benchmark,
            strategy.self_defined
        )

    account.iniData()
    account.iniData2()
    account.iniData3()

    time_list = my_test.get_deal_time_list(account)

    accounts = parallel.create_accounts(time_list, account)

    back_test_parallel = parallel.Beck_Test_Parallel()

    back_test_parallel.start_client(
        '/home/fit/.ipython/profile_default/security/ipcontroller-client.json')

    back_test_parallel.dview.execute('import my_test')
    back_test_parallel.dview.execute('import my_strategy as strategy')
    # get the result
    result = back_test_parallel.parallel_map(let_us_deal, accounts)

    for acc in result.get():
        print acc.reselected_stocks, acc.current_time

我已经在Back_Test_Parallel 类中的parallel_map() 函数中导入了my_test 模块,并且我还在back_test_parallel.dview.execute('import my_test') 中导入了my_test 模块。

并且对应的模块在引擎机器的工作目录下。我已将ipcontroller-client.jsonipcontroller-engine.json 复制到engine machine 的工作目录中。

但是当它运行时,错误是ImportError: No module named my_test,因为模块my_test.py 已经在工作目录中。这真的让我感到沮丧!

---------------------------------------------------------------------------
CompositeError                            Traceback (most recent call last)
/home/fit/log/1027/back_test/main.py in <module>()
    119     import ipdb
    120     ipdb.set_trace()
--> 121     for acc in result.get():
    122         print acc.reselected_stocks, acc.current_time
    123 

/usr/local/lib/python2.7/dist-packages/ipyparallel/client/asyncresult.pyc in get(self, timeout)
    102                 return self._result
    103             else:
--> 104                 raise self._exception
    105         else:
    106             raise error.TimeoutError("Result not ready.")

CompositeError: one or more exceptions from call to method: let_us_deal
[0:apply]: ImportError: No module named my_test
[1:apply]: ImportError: No module named my_test

关于result

In [2]: result
Out[2]: <AsyncMapResult: finished>
In [3]: type(result)
Out[3]: ipyparallel.client.asyncresult.AsyncMapResult

请注意,当它使用ipcluster start -n 8 在单机上运行时,它工作正常,没有任何错误。
提前致谢

【问题讨论】:

  • 您能否再次检查引擎的 CWD 是否与您认为的一样? print(client[:].apply_sync(os.getcwd))
  • @minrk,谢谢,我得到了正确的 CWD,也许我没有将最新的 ipcontroller-client.json ipcontroller-engine.json 复制到引擎机器。感谢您为开发此软件包所做的辛勤工作。
  • @minrk,我认为我的 CWD 不在正确的目录中,所以,在并行计算之前,我将设置正确的 CWD:&gt;&gt;&gt; import os&gt;&gt;&gt; dview.map(os.chdir, ['/path/to/my/project/on/engine']*number_of_engines),它工作正常。谢谢。

标签: python ipython ipython-parallel


【解决方案1】:

我认为我的 CWD 不在正确的目录中。所以你可以检查你的 CWD

>>> import os
>>> print(dview.apply_sync(os.getcwd).get())

如果在错误的目录下,在并行计算之前,你可以设置正确的 CWD 以确保你的 ipyparallel env 在正确的工作目录下:

>>> import os
>>> dview.map(os.chdir, ['/path/to/my/project/on/engine']*number_of_engines)
>>> print(dview.apply_sync(os.getcwd).get())

您还可以通过

检查引擎的名称
>>> import socket
>>> print(dview.apply_sync(socket.gethostname))

而且效果很好!

【讨论】:

    【解决方案2】:

    pip install ipyparallel --upgrade

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-14
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 2016-02-17
      • 2015-07-22
      • 1970-01-01
      相关资源
      最近更新 更多