फ़ाइल नाम चर का उपयोग नवीनतम फ़ाइल का नाम प्राप्त करने के लिए किया जाता है मेरा उद्देश्य एक फ़ोल्डर की निगरानी करना है और जब भी नई फ़ाइल पुनर्प्राप्त की जाती है, तो इसे स्वचालित रूप से boto3 का उपयोग करके s3 बाल्टी में अपलोड कर दें।

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from subprocess 
import call
import os
import boto3

सत्र = boto3.Session(aws_access_key_id='aws_access_key_id', aws_secret_access_key='aws_secret_access_key', Region_name='region_name')

S3 = session.client ('s3')

class Watcher:
    def __init__(self):
        self.dir = os.path.abspath('D:\\project')
        self.observer = Observer()

    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler, self.dir, recursive=True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Error")

        self.observer.join()   

    class Handler(FileSystemEventHandler):
        @staticmethod
        def on_any_event(event):
            if event.is_directory:
                return None

        elif event.event_type == 'created':
        print("Received created event - %s." % event.src_path)
        s3.upload_file(Filename=event.src_path, bucket='bucketname, key=test-file-1)

if __name__ == '__main__':
    w = Watcher()
    w.run()

FileNotFoundError: [WinError 2] सिस्टम निर्दिष्ट फ़ाइल नहीं ढूँढ सकता

1
prishu pandey 14 सितंबर 2019, 17:22

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि @alexhall ने टिप्पणी में उल्लेख किया है, s3.meta.client.upload_file विधि एक फ़ाइल अपलोड करेगी। आप boto3 s3 क्लाइंट की अपलोड विधि दस्तावेज़ीकरण के बारे में यहाँ पढ़ सकते हैं: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_file। हालाँकि, यह उनके पास थोड़ा मूर्खतापूर्ण उदाहरण है, क्योंकि वे पहले s3 क्लाइंट के बजाय s3 संसाधन बना रहे हैं, और फिर क्योंकि s3 संसाधन में वास्तव में फ़ाइल अपलोड करने का कोई तरीका नहीं है, वे वापस s3 क्लाइंट पर वापस आ जाते हैं। आप अपलोड के लिए सीधे s3 क्लाइंट बना सकते हैं और उसका उपयोग कर सकते हैं।

आप इस तथ्य पर भी भरोसा कर रहे हैं कि जब आप s3 संसाधन बनाते हैं तो boto3 डिफ़ॉल्ट सत्र का उपयोग करता है:

Boto3.resource('s3')

यह ठीक काम करेगा यदि आप लैम्ब्डा पर कोड चला रहे हैं या यदि आप एक ईसी 2 इंस्टेंस में हैं जिसमें एस 3 तक पहुंचने के लिए आईएएम भूमिका कॉन्फ़िगर की गई है, लेकिन मुझे लगता है कि आप इसे एडब्ल्यूएस के बाहर चला रहे हैं, इस मामले में, आपके पास एक boto3 हो सकता है .Session() पहले आपके क्रेडेंशियल्स का उपयोग करके बनाया गया था, और फिर एक क्लाइंट (या संसाधन) उस सत्र का उपयोग कर सकता है।

aws_access_key_id = '<AWS_ACCESS_KEY_ID>'
aws_secret_access_key = '<AWS_SECRET_ACCESS_KEY>'
region_name = 'us-east-1'

session = boto3.Session(aws_access_key_id=aws_access_key_id,
                                aws_secret_access_key=aws_secret_access_key,
                                region_name=region_name)

s3 = session.client('s3')

आप यहां सत्र कॉन्फ़िगरेशन के बारे में पढ़ सकते हैं: https://boto3. amazonaws.com/v1/documentation/api/latest/guide/configuration.html

जैसा कि ऊपर उल्लेख किया गया है, क्योंकि आप फ़ाइल अपलोड करने का प्रयास कर रहे हैं, और आप इसके साथ कुछ और नहीं कर रहे हैं, आप सीधे s3 संसाधन के बजाय एक s3 क्लाइंट बना सकते हैं जैसे आपने किया था और फिर s3 क्लाइंट प्राप्त करने के लिए 'meta. ग्राहक'।

command = ... लाइन के बजाय, आप बस उपयोग करें:

s3.upload_file(Filename, Bucket = 'aaaaa', Key='test-file-1')

आप अंतिम पंक्ति को हटा सकते हैं। आप 'कॉल' करेंगे यदि आप पाइथन के भीतर किसी चीज़ के बजाय ओएस/सिस्टम कमांड चला रहे थे।

0
Adil Hindistan 14 सितंबर 2019, 23:08

सुनिश्चित नहीं हैं कि आप अजगर (boto3) सीखने के लिए ऐसा कर रहे हैं। अगर ऐसा है तो बधाई। यदि नहीं, तो AWS ने पहले ही ऐसी सुविधा प्रदान कर दी है। तो आप सब कुछ अपने कोड में रखते हैं, लेकिन एडब्ल्यूएस सीएलआई को खोल देते हैं।

0
Robert Co 14 सितंबर 2019, 19:04