多处理错误:无法导入模块

时间:2014-05-06 14:03:30

标签: python multiprocessing

我收到一条我无法解决的错误消息。我不知道多处理库有什么问题,我不明白为什么它说导入build_database模块是不可能的,但同时它完全执行该模块的功能。

有人能告诉我他是否看到了什么。谢谢。

Traceback (most recent call last):
    File "<string>", line 1, in <module>
    File "C:\Python27\lib\multiprocessing\forking.py", line 380, in main
Traceback (most recent call last):
    File "<string>", line 1, in <module>
prepare(preparation_data)
    File "C:\Python27\lib\multiprocessing\forking.py", line 380, in main
    File "C:\Python27\lib\multiprocessing\forking.py", line 495, in prepare
        prepare(preparation_data)
'__parents_main__', file, path_name, etc
  File "C:\Python27\lib\multiprocessing\forking.py", line 495, in prepare
  File "C:\Users\Comp3\Desktop\User\Data\main.py", line 4, in <module>
         '__parents_main__', file, path_name, etc
import database.build_database
  File "C:\Users\Comp3\Desktop\User\Data\main.py", line 4, in <module>
ImportError    : import database.build_database
NImportErroro module named build_database:
No module named build_database

这就是我在load_bigquery.py文件中的内容:

# Send CSV to Cloud Storage 
def load_send_csv(table):
    job = multiprocessing.current_process().name
    print '[' + table + '] : job starting (' + job + ')'
    bigquery.send_csv(table)    


@timer.print_timing  
def send_csv(tables):
    jobs = []

    build_csv(tables)

    for t in tables:
        if t not in csv_targets:
            continue

        print ">>>> Starting " + t

        # Load CSV in BigQuery, as parallel jobs
        j = multiprocessing.Process(target=load_send_csv, args=(t,))
        jobs.append(j)
        j.start()

    # Wait for jobs to complete
    for j in jobs:
        j.join()     

我从main.py中这样称呼它:

bigquery.load_bigquery.send_csv(tables)

我的文件夹是这样的:

src
|   main.py
|
├───bigquery
│   │   bigquery.py
│   │   bigquery2.dat
│   │   client_secrets.json
│   │   herokudb.py
│   │   herokudb.pyc
│   │   distimo.py
│   │   flurry.py
│   │   load_bigquery.py
│   │   load_bigquery.pyc
│   │   timer.py
│   │   __init__.py
│   │   __init__.pyc
│   │   
│   │   
├───database
│   │   build_database.py
│   │   build_database.pyc
│   │   build_database2.py
│   │   postgresql.py
│   │   timer.py
│   │   __init__.py
│   │   __init__.pyc

如果我单独执行load_bigquery.py,那么该函数可以正常工作,但是如果我将它导入main.py则会因上面给出的错误而失败。

更新:

这是我的导入,也许它可能会有所帮助:

main.py
         import database.build_database
         import bigquery.load_bigquery
         import views.build_analytics
         import argparse
         import getopt
         import sys
         import os

load_bigquery.py
         import sys
         import os
         import subprocess
         import time
         import timer
         import distimo
         import flurry
         import herokudb
         import bigquery
         import multiprocessing
         import httplib2

bigquery.py
         import sys
         import os
         import subprocess
         import json
         import time
         import timer
         import httplib2

         from pprint              import pprint
         from apiclient.discovery import build
         from oauth2client.file   import Storage
         from oauth2client.client import AccessTokenRefreshError
         from oauth2client.client import OAuth2WebServerFlow
         from oauth2client.client import flow_from_clientsecrets
         from oauth2client.tools  import run
         from apiclient.errors    import HttpError

也许问题在于load_bigquery.py导入多处理,然后main.py导入load_bigquery.py?

1 个答案:

答案 0 :(得分:1)

您可能错过__init__.py内的src/bigquery/。所以你的源文件夹应该是:

> src/main.py
> src/bigquery/__init__.py
> src/bigquery/load_bigquery.py
> src/bigquery/bigquery.py  

__init__.py只需要为空,只有那里才能让Python知道bigquery是Python package

更新:显然__init__.py文件存在。实际的错误消息说明了一个不同的错误,即无法导入database.build_database

我的建议是调查一下。它没有被提到是在src文件夹中......

更新2:我认为你的进口存在冲突。 Python 2有一个稍微模糊的相对导入,有时会将人们赶出去。您同时拥有一个名为main.py database的{​​{1}}和bigquery database内的bigquery。我想你最终会得到build_database内的那个,{{1}}没有{{1}}。尝试重命名其中一个。