2012-02-07 10 views
8

私は、なぜAttributeErrorエラーを受け取っているのか、少し混乱しています。 'module'オブジェクトには属性 'strptime'がありません。 Pythonスクリプトでdatetimeをインポートしてdatetime.datetime.strptime(string、format)を呼び出すと、すべて正常に動作しますが、datetime import datetimeから呼び出してdatetime.strptime(string、format)を呼び出すと、スクリプトは上記のエラーでクラッシュします。私は、インポートdatetimeを使用してdatetime.datetimeを呼び出すことができますが、私はまだdatetime.strptime(string、format)の呼び出しでdatetime import datetimeがクラッシュする理由について興味があります。なぜこれが起こっているかもしれないかについての任意のアイデア?私のコードは以下の...AttributeError: 'module'オブジェクトには属性がありません 'strptime' - 可能なバグ?

Bulkolader.yaml

python_preamble: 
- import: re 
- import: base64 

- import: hs_transformers 

- import: google.appengine.ext.db 
- import: google.appengine.ext.bulkload.transform 
- import: google.appengine.ext.bulkload.bulkloader_wizard 

- import: google.appengine.api.datastore 


transformers: 

- kind: HBO 
    connector: csv 

    property_map: 
    - property: __key__ 
     external_name: swfServerID 
     import_transform: hs_transformers.string 

    - property: IP_address 
     external_name: IP 
     import_transform: hs_transformers.string 

    - property: name 
     external_name: swfServer 
     import_transform: hs_transformers.swfServer 

    - property: checkin 
     external_name: clockStampOfLastCheckin 
     import_transform: hs_transformers.date_time 

    - property: update 
     external_name: clockStampOfLastUpdate 
     import_transform: hs_transformers.clockStampOfLastUpdate 

    - property: form_factor 
     external_name: formFactor 
     import_transform: hs_transformers.string 

    - property: serial_number 
     external_name: serialNumber 
     import_transform: hs_transformers.string 

    - property: reverse_SSH 
     external_name: allowReverseSSH 
     import_transform: hs_transformers.boolean 

    - property: insight_account 
     external_name: FK_insightAccountID 
     import_transform: hs_transformers.integer 

    - property: version 
     external_name: ver 
     import_transform: hs_transformers.string 

hs_transformers.py

import re 
import logging 
from datetime import datetime 
from shared.datastore import * 
import google.appengine.ext.bulkload.transform 
from google.appengine.api import memcache 


def clockStampOfLastUpdate(passed_clockstamp): 
    try: 
     if passed_clockstamp != "NULL": 
      datetime_object = date_time(passed_clockstamp) 
      return_file_update = memcache.get(str(datetime_object), namespace = "HBOImport") 

      if not return_file_update: 
       return_file_update = FileUpdate.lastBefore(datetime_object) 
       memcache.set(str(datetime_object), return_file_update, namespace = "HBOImport", time = 20) 

      if return_file_update != None: return return_file_update.key() 
    except Exception, e: 
     logging.error(e) 


def string(passed_string): 
    try: 
     if passed_string != "NULL": return passed_string 
    except Exception, e: 
     logging.error(e) 


def swfServer(passed_url): 
    try: 
     if passed_url != "NULL": return passed_url.split('//', 1)[1].split('.')[0] 
    except Exception, e: 
     logging.error(e) 


def date_time(passed_datetime): 
    try: 
     if passed_datetime != "NULL": return datetime.strptime(passed_datetime, '%m/%d/%y %H:%M') 
    except Exception, e: 
     logging.error(e) 


def boolean(passed_boolean): 
    try: 
     if passed_boolean != "NULL": 
      if passed_boolean == "T": return True 
      if passed_boolean == "F": return False 
    except Exception, e: 
     logging.error(e) 


def integer(passed_integer): 
    try: 
     if passed_integer != "NULL": return int(passed_integer) 
    except Exception, e: 
     logging.error(e) 

CMDエラー...

Microsoft Windows [Version 6.1.7600] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\Users\Jack Frost>cd "C:\Program Files (x86)\Google App Engine SDK" 

C:\Program Files (x86)\Google App Engine SDK>python appcfg.py upload_data --url=http://bulkloader-testing.appspot.com/remote_api --config_file="C:\Users\Jack Frost\Eclipse Workspace\Headsprout\GAE 2.1.2012\src\utilities\bulkloader\bulkloader.yaml" --filename="C:\Users\Jack Frost\Eclipse Workspace\Headsprout\GAE 2.1.2012\src\utilities\bulkloader\csv_files\small_hbos.csv" --kind=HBO 
Uploading data records. 
[INFO ] Logging to bulkloader-log-20120207.105053 
[INFO ] Throttling transfers: 
[INFO ] Bandwidth: 250000 bytes/second 
[INFO ] HTTP connections: 8/second 
[INFO ] Entities inserted/fetched/modified: 20/second 
[INFO ] Batch Size: 10 
[INFO ] Opening database: bulkloader-progress-20120207.105053.sql3 
[INFO ] Connecting to bulkloader-testing.appspot.com/remote_api 
[INFO ] Starting import; maximum 10 entities per post 
PASSED DATETIME 2/1/12 17:52 
TYPE <type 'unicode'> 
[ERROR ] [WorkerThread-0] WorkerThread: 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\tools\adaptive_thread_pool.py", line 176, in WorkOnItems 
status, instruction = item.PerformWork(self.__thread_pool) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\tools\bulkloader.py", line 764, in PerformWork 
transfer_time = self._TransferItem(thread_pool) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\tools\bulkloader.py", line 933, in _TransferItem 
self.content = self.request_manager.EncodeContent(self.rows) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\tools\bulkloader.py", line 1394, in EncodeContent 
entity = loader.create_entity(values, key_name=key, parent=parent) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\ext\bulkload\bulkloader_config.py", line 445, in create_entity 
entity = self.dict_to_entity(input_dict, self.bulkload_state) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\ext\bulkload\bulkloader_config.py", line 147, in dict_to_entity 
self.__run_import_transforms(input_dict, instance, bulkload_state_copy) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\ext\bulkload\bulkloader_config.py", line 252, in __run_import_transforms 
value = self.__dict_to_prop(transform, input_dict, bulkload_state) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\ext\bulkload\bulkloader_config.py", line 207, in __dict_to_prop 
value = transform.import_transform(value) 
    File "C:\Program Files (x86)\Google App Engine SDK\google\appengine\ext\bulkload\bulkloader_parser.py", line 111, in __call__ 
return self.method(*args, **kwargs) 
    File "C:\Users\Jack Frost\Eclipse Workspace\Headsprout\GAE 2.1.2012\src\utilities\bulkloader\hs_transformers.py", line 44, in date_time 
print datetime.strptime(passed_datetime, '%m/%d/%y %H:%M') 
AttributeError: 'module' object has no attribute 'strptime' 
[INFO ] [WorkerThread-1] Backing off due to errors: 1.0 seconds 
[INFO ] An error occurred. Shutting down... 
[ERROR ] Error in WorkerThread-0: 'module' object has no attribute 'strptime' 

[INFO ] 10 entities total, 0 previously transferred 
[INFO ] 0 entities (1516 bytes) transferred in 3.0 seconds 
[INFO ] Some entities not successfully transferred 
+1

ニート。あなたは使用する必要のある回避策をはっきりと知っていますが、なぜこれが当てはまるのか(私と同じように)興味があります。私はPython 2.xのインポートメカニズムを掘り下げていましたが、一般的に明示的に(すなわち、 "datetime import datetimeから" "import datetime"を好む)多くの奇妙な問題を避けることができます。おそらく、Google AppEngineのコードの一部が輸入を乱していると推測する以外は、この特定の問題がなぜあなたに向けて起こっているのかはわかりません。 – mattbornski

+0

はい、技術的に両者がうまくいけば、なぜ私はもう一方のインポートラインを使用しなければならないのか不思議です。私の前提は、.yamlファイル内のimport文の1つが、datetime import datetimeという行を使用している別のスクリプト(Googleのスクリプトの1つ)をインポートしているため、2つのスクリプト間で奇妙なやり取りが発生しているということです。 –

答えて

13

おそらく

from shared.datastore import * 
0123です

は、モジュールとしてdatetimeを再定義しています。

あなたはあなたのコード

from datetime import datetime 
print(datetime) 
from shared.datastore import * 
print(datetime) 

にprint文を入れてdatetimeの値が変更された場合見ることによって、この推測を確認することができます。

私の推測が間違っている場合は、datetimeの値を変更している行が見つかるまで、print文を使用してコードを "二等分"することができます。

(それは、これらの奇妙なバグの原因となり得るので、いずれにせよ、インポートのワイルドカード形式を使用しないことが好ましい。)

+0

アドバイスをいただきありがとうございます。 –

+6

物語のモラル: '輸入*'しないでください。 – katrielalex

関連する問題