2012-02-07 42 views
8

Tôi hơi bối rối vì sao tôi nhận được lỗi AttributeError: đối tượng 'module' không có thuộc tính 'strptime'. Khi tôi nhập datetime trong kịch bản Python của tôi và gọi datetime.datetime.strptime (chuỗi, định dạng) mọi thứ hoạt động tốt nhưng khi tôi viết từ datetime import datetime và gọi datetime.strptime (string, format) script của tôi bị lỗi với lỗi trên. Tôi tốt bằng cách sử dụng datetime nhập khẩu và gọi datetime.datetime nhưng tôi vẫn tò mò là tại sao từ datetime nhập datetime đổ vỡ vào cuộc gọi datetime.strptime (string, format). Bất kỳ ý tưởng nào về lý do tại sao điều này có thể xảy ra? Mã của tôi là dưới đây ...AttributeError: đối tượng 'module' không có thuộc tính 'strptime' - Lỗi có thể xảy ra?

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) 

lỗi 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

Gọn gàng. Bạn biết rõ cách giải quyết mà bạn phải sử dụng, và chỉ tò mò là tại sao đây là trường hợp (như tôi). Tôi đã dành một số thời gian đào bới xung quanh trong các cơ chế nhập khẩu của Python 2.x và tôi có thể nói với bạn rằng nói chung, rõ ràng (ví dụ: "nhập" ngày giờ "nhập" từ datetime import datetime ") né tránh nhiều vấn đề lạ. Tôi không thể cho bạn biết tại sao vấn đề cụ thể này lại xuất hiện cho bạn, ngoại trừ suy đoán rằng có lẽ một số mã Google AppEngine đang gây rối với hàng nhập khẩu. – mattbornski

+0

Có, tôi chỉ tò mò là tại sao tôi phải sử dụng một dòng nhập khẩu trên khác khi về mặt kỹ thuật cả hai đều nên làm việc. Giả định của tôi là một trong các câu lệnh nhập trong tệp .yaml của tôi đang nhập một tập lệnh khác (một trong các tập lệnh của Google) đang sử dụng dòng từ datetime nhập ngày giờ và kết quả là nó gây ra tương tác lạ giữa hai tập lệnh. –

Trả lời

13

lẽ

from shared.datastore import * 

đang xác định lại datetime làm mô-đun.

Bạn có thể kiểm tra đoán này bằng cách đặt câu in trong mã của bạn

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

và nhìn thấy nếu giá trị của datetime đã thay đổi.

Nếu dự đoán của tôi sai, bạn vẫn có thể sử dụng lệnh in để "chia đôi" mã của bạn cho đến khi bạn tìm thấy dòng nào đang thay đổi giá trị datetime.

(Bất kể trường hợp nào, tốt hơn là không sử dụng hình thức nhập khẩu ký tự đại diện, vì nó có thể là nguồn gốc của các lỗi lạ này.)

+0

Cảm ơn lời khuyên. –

+6

Đạo đức của câu chuyện: không 'nhập *'. – katrielalex

Các vấn đề liên quan