2009-04-28 12 views
6

मैं डोमेनकेस और डीकेआईएम के लिए ओपन सोर्स ईमेल मार्केटिंग प्रोग्राम में कुछ समर्थन हैक कर रहा हूं, जो एसएमटीपी के माध्यम से वास्तविक ईमेल भेजने के लिए एक पायथन स्क्रिप्ट का उपयोग करता है। मैंने त्वरित और गंदे मार्ग पर जाने का फैसला किया, और बस एक पर्ल स्क्रिप्ट लिखें जो एसटीडीआईएन से एक ईमेल संदेश स्वीकार करता है, इसे संकेत देता है, फिर इसे हस्ताक्षरित करता है।पायथन से पर्ल स्क्रिप्ट को कैसे कॉल करें, इसमें पाइपिंग इनपुट?

मैं जो करना चाहता हूं, वह पाइथन लिपि से है, पर्ल स्क्रिप्ट के लिए एक स्ट्रिंग में ईमेल टेक्स्ट पाइप करें, और परिणाम को दूसरे चर में संग्रहीत करें, इसलिए मैं हस्ताक्षरित ईमेल भेज सकता हूं। मैं बिल्कुल एक अजगर गुरु नहीं हूं, और मुझे ऐसा करने का अच्छा तरीका नहीं दिख रहा है। मुझे पूरा यकीन है कि मैं इसके लिए os.system जैसे कुछ उपयोग कर सकता हूं, लेकिन एक चर को पर्ल स्क्रिप्ट में पाइप करना कुछ ऐसा लगता है जो मुझे आकर्षित करता है।

संक्षेप में: मैं एक पाइथन स्क्रिप्ट से एक चरखी स्क्रिप्ट पर एक चर पाइप कैसे कर सकता हूं, और परिणाम पायथन में संग्रहीत कर सकता हूं?

संपादित करें: मैं शामिल करने के लिए प्रणाली के साथ मैं काम कर रहा हूँ केवल अजगर v2.3

उत्तर

9

os.popen() है कि stdin और उपप्रक्रिया की stdout के साथ एक टपल वापस आ जाएगी भूल गया।

+6

पॉपन संस्करण 2.6 के बाद से हटा दिया गया है, तो आपको इसके बजाय उपप्रोसेसर का उपयोग करना चाहिए। –

+1

-1: बहिष्कृत। उपप्रोसेसर मॉड्यूल का प्रयोग करें। – nosklo

+3

प्रश्न से: "केवल पाइथन v2.3 है" बहिष्कृत अभी तक नहीं हुआ है। –

2

"मुझे पूरा यकीन है कि मैं इसके लिए ओएससिस्टम जैसे कुछ का उपयोग कर सकता हूं, लेकिन एक चर को पर्ल स्क्रिप्ट में पाइप करना ऐसा कुछ है जो मुझे आकर्षित करता है।"

सही। subprocess मॉड्यूल os.system की तरह है, लेकिन पाइपिंग सुविधाओं को प्रदान करता है जिन्हें आप ढूंढ रहे हैं।

+0

मुझे यह स्पष्ट करना चाहिए था कि मैं केवल पायथन 2.3 के साथ काम कर रहा हूं, और ऐसा लगता है कि उपप्रोसेसर मॉड्यूल 2.4 और बाद के लिए है। –

+0

@ एलेक्स किला: 2.4 से उपप्रोसेसर मॉड्यूल को पकड़ें और इसे 2.3 पर चलाएं। ऐसा लगता है कि काम करता है। – nosklo

6
from subprocess import Popen, PIPE 
p = Popen(['./foo.pl'], stdin=PIPE, stdout=PIPE) 
p.stdin.write(the_input) 
p.stdin.close() 
the_output = p.stdout.read() 
2

मैं वहाँ एक कारण है कि आप नीचे मार्ग आपके द्वारा चुने गए जा रहे है यकीन है, लेकिन क्यों न सिर्फ अजगर में हस्ताक्षर किए जाने हैं?

आप इसे कैसे साइन कर रहे हैं? शायद हम एक पायथन कार्यान्वयन लिखने में कुछ आश्वासन प्रदान कर सकते हैं?

+0

मैं * पायथन से हस्ताक्षर करूँगा, लेकिन मेरा पायथन-फू बहुत कमजोर है। यह एक और इष्टतम समाधान होगा, हालांकि, मैं भविष्य में विचार कर सकता हूं, खासकर अगर मैं समुदाय को कोड का योगदान करने का फैसला करता हूं। –

+0

यदि आप कहीं पर्ल समाधान पोस्ट करते हैं तो मुझे कोशिश करने और इसे बदलने में मदद करने में खुशी होगी :-) –

+0

पर्ल समाधान वास्तव में सरल है। मैं सिर्फ मेल :: डीकेआईएम मॉड्यूल का लाभ उठा रहा हूं, जो एक ईमेल को बहुत छोटा सा हस्ताक्षर करता है। –

10

subprocess का उपयोग करें।

#!/usr/bin/python 

import subprocess 

var = "world" 

pipe = subprocess.Popen(["./x.pl", var], stdout=subprocess.PIPE) 

result = pipe.stdout.read() 

print result 

यहाँ और पर्ल स्क्रिप्ट है:: यहाँ अजगर स्क्रिप्ट है

#!/usr/bin/perl 

use strict; 
use warnings; 

my $name = shift; 

print "Hello $name!\n"; 
+0

प्रश्न के मुताबिक, पर्ल स्क्रिप्ट इनपुट स्वीकार करनी चाहिए, न कि एक तर्क। – ngn

1

मैं भी करने की कोशिश की करने के लिए है कि केवल कॉन्फ़िगर यह

pipe = subprocess.Popen(
      ['someperlfile.perl', 'param(s)'], 
      stdin=subprocess.PIPE 
     ) 
response = pipe.communicate()[0] 

के रूप में मैं चाहता हूँ काम करने के लिए कैसे इससे आपको काम करने में मदद मिलेगी।

संबंधित मुद्दे