6

के भीतर से बाइनरी नहीं चला सकते। कोशिश करने और इसे पाने के लिए मैंने एक बाइनरी बनाने के लिए pyinstaller चलाया है जिसे मैं उम्मीदपूर्वक निष्पादित कर सकता हूं। इस फ़ाइल को map_reader नाम दिया गया है और लैम्ब्डा ज़िप पैकेज के शीर्ष स्तर पर बैठता है। यहाँमैं एक लैम्ब्डा समारोह के भीतर इस उपकरण को चलाने के लिए कोशिश कर रहा हूँ अजगर एडब्ल्यूएस लैम्ब्डा समारोह

command = 'chmod 755 map_reader' 
args = shlex.split(command) 
print subprocess.Popen(args) 

command = './map_reader -g "{}" -t "{}"'.format('/tmp/mapFiles', '/tmp/tiles') 
args = shlex.split(command) 
print subprocess.Popen(args) 

और त्रुटि है, जो दूसरे subprocess.Popen कॉल पर होता है:

नीचे कोड मैं कोशिश करते हैं और उपकरण चलाने के लिए उपयोग कर रहा हूँ है

<subprocess.Popen object at 0x7f08fa100d10> 
[Errno 13] Permission denied: OSError 

मैं कैसे चला सकते हैं यह सही ढंग से?

+0

मुझे लगता है कि आप जिस वातावरण में चल रहे हैं, वह मुझे लगता है आपको स्थानीय फाइलों को निष्पादन योग्य बनाने की अनुमति नहीं देता है। "अनुमति अस्वीकार" का अर्थ यह हो सकता है कि यह वास्तव में क्या कहता है। – Blckknght

उत्तर

3

आप वास्तव में क्या समस्या में गुमराह हो गए हैं।

मुझे नहीं लगता कि पहला पॉपन सफलतापूर्वक भाग गया। मुझे लगता है कि यह सिर्फ मानक त्रुटि में एक संदेश छोड़ दिया और आप इसे देख नहीं रहे हैं। यह शायद कह रहा है मेरा सुझाव है कि

chmod: map_reader: No such file or directory 

आप इन 2 में से किसी की कोशिश कर सकते हैं:

  1. /tmp में पैकेज से map_reader निकालें। फिर इसे /tmp/map_reader के साथ संदर्भित करें।
  2. कर के रूप में टिम वैगनर, एडब्ल्यूएस लैम्ब्डा के महाप्रबंधक ने कहा लेख Running Arbitrary Executables in AWS Lambda में पालन करते हुए सिफारिश की:
अपनी खुद की निष्पादनयोग्य सहित

आसान है; बस उन्हें अपलोड की गई ज़िप फ़ाइल में पैकेज करें, और फिर उन्हें संदर्भित करें (आपके द्वारा बनाई गई ज़िप फ़ाइल के सापेक्ष पथ सहित) जब आप उन्हें Node.js से कॉल करते हैं या अन्य प्रक्रियाओं से जिन्हें आपने पहले शुरू किया था। सुनिश्चित करें कि आपका समारोह कोड के शुरू में निम्नलिखित है कि आप में शामिल :

process.env[‘PATH’] = process.env[‘PATH’] + ‘:’ + process.env[‘LAMBDA_TASK_ROOT’] 

ऊपर कोड नोड जे एस के लिए लेकिन अजगर के लिए है, यह निम्नलिखित

import os os.environ['PATH']

की तरह है कि कमांड command = './map_reader <arguments> काम करना चाहिए।

वे अभी भी काम नहीं करते हैं, तो आप भी chmod 755 map_readerसे पहले चल पैकेज बनाने और (सुझाव के रूप में in this other question) अपलोड करने का विचार कर सकते हैं।

+0

सही के रूप में चिह्नित हालांकि यह मेरे लिए एक पूर्ण समाधान नहीं था। मैं दूसरे मुद्दे के साथ एक और जवाब पोस्ट करूंगा। यहां महत्वपूर्ण बात बाइनरी को/tmp में ले जा रही थी ताकि मैं इस पर कार्य कर सकूं। – stevepkr84

+0

मैं यह सुनिश्चित करना भूल गया कि आपने अमेज़ॅन लिनक्स के लिए संकलित किया है। मैंने माना कि आपने इसका ख्याल रखा है। मुझे खुशी है कि आपने इसे समझ लिया। –

+0

आपके पथ में LAMBDA_TASK_ROOT जोड़ने के लिए आपके लिए काम नहीं किया है? –

2

यहां दो मुद्दे थे। सबसे पहले, जेशान के जवाब के अनुसार, मुझे इससे पहले कि मैं इसे ठीक से एक्सेस कर सकूं, मुझे बाइनरी को/tmp में ले जाना पड़ा।

दूसरा मुद्दा यह था कि मैं एक फ़ाइल बनाकर उबंटू पर पाइंस्टॉलर चलाता। मैंने लैम्ब्डा कंटेनर चलाने के समान वास्तुकला पर संकलन सुनिश्चित करने के बारे में कुछ और टिप्पणियां देखीं। इसलिए मैंने अमेज़ॅन लिनक्स एएमआई के आधार पर ec2 पर pyinstaller चलाया। आउटपुट एकाधिक .os फाइलें थीं, जो टीएमपी में चले गए, अपेक्षित के रूप में काम किया।

1
copyfile('/var/task/yourbinary', '/tmp/yourbinary') 
os.chmod('/tmp/yourbinary', 0555) 

/tmp को बाइनरी स्थानांतरण और बनाने यह निष्पादन के लिए मुझे

3

काम मैं जानता हूँ कि मैं इस के लिए देर से एक सा कर रहा हूँ, लेकिन यदि आप ऐसा करने का एक अधिक सामान्य तरीका चाहते हैं (उदाहरण के लिए अगर आपके पास बाइनरी का एक बहुत और उन सब) का उपयोग नहीं हो सकता है, यह कैसे मैं यह कर, आप अपने py फ़ाइल के आगे एक बिन फ़ोल्डर में अपने सभी बाइनरी डाल प्रदान की है, और एक lib फ़ोल्डर में सभी पुस्तकालयों:

import shutil 
import time 
import os 
import subprocess 

LAMBDA_TASK_ROOT = os.environ.get('LAMBDA_TASK_ROOT', os.path.dirname(os.path.abspath(__file__))) 
CURR_BIN_DIR = os.path.join(LAMBDA_TASK_ROOT, 'bin') 
LIB_DIR = os.path.join(LAMBDA_TASK_ROOT, 'lib') 
### In order to get permissions right, we have to copy them to /tmp 
BIN_DIR = '/tmp/bin' 

# This is necessary as we don't have permissions in /var/tasks/bin where the lambda function is running 
def _init_bin(executable_name): 
    start = time.clock() 
    if not os.path.exists(BIN_DIR): 
     print("Creating bin folder") 
     os.makedirs(BIN_DIR) 
    print("Copying binaries for "+executable_name+" in /tmp/bin") 
    currfile = os.path.join(CURR_BIN_DIR, executable_name) 
    newfile = os.path.join(BIN_DIR, executable_name) 
    shutil.copy2(currfile, newfile) 
    print("Giving new binaries permissions for lambda") 
    os.chmod(newfile, 0775) 
    elapsed = (time.clock() - start) 
    print(executable_name+" ready in "+str(elapsed)+'s.') 

# then if you're going to call a binary in a cmd, for instance pdftotext : 

_init_bin('pdftotext') 
cmdline = [os.path.join(BIN_DIR, 'pdftotext'), '-nopgbrk', '/tmp/test.pdf'] 
subprocess.check_call(cmdline, shell=False, stderr=subprocess.STDOUT) 
संबंधित मुद्दे