2010-03-31 14 views
6

मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जो ज्योथन और जावा कोड का एक गुच्छा घुमाता है। कार्यक्रम की प्रकृति (wsadmin का उपयोग करके) हम वास्तव में पाइथन 2.1पाइथन का उपयोग करके एक जार फ़ाइल के अंदर आप एक पायथन लिपि कैसे आते हैं?

पर प्रतिबंधित हैं वर्तमान में हमारे पास जावा स्रोत और .py मॉड्यूल दोनों जार हैं। कोड वर्तमान में जावा का उपयोग करके बुलाया गया है, लेकिन मैं इसे जितना संभव हो उतना कार्यक्षमता माइग्रेट करने के पक्ष में इसे हटाना चाहता हूं।

मेरी समस्या यह है कि मैं या तो कॉलिंग जेथॉन स्क्रिप्ट से मौजूदा जार फ़ाइल के अंदर पाइथन मॉड्यूल आयात या निष्पादित करना चाहता हूं। मैंने सफलता के बिना दो अलग-अलग तरीकों की कोशिश की है।

मेरे निर्देशिका संरचना लगता है:

application.jar 
    |-- com 
     |--example 
      |-- action 
       |-- MyAction.class 
       |-- pre_myAction.py 

1 दृष्टिकोण मैंने कोशिश की जार से आयात करने के लिए किया गया था। मैंने अपने sys.path में जार जोड़ा और आयात com.example.action.myAction और आयात का उपयोग करके मॉड्यूल आयात करने का प्रयास किया, मेरा एक्शन आयात करें। हालांकि, कोई सफलता नहीं है, भले ही मैंने init .py प्रत्येक फ़ाइल पर निर्देशिका में फ़ाइलें डालीं।

मैंने जिस दूसरे दृष्टिकोण की कोशिश की वह जावा वर्ग का उपयोग कर संसाधन लोड करना था। तो मैंने नीचे दिया गया कोड लिखा:

import sys 
import os 
import com.example.action.MyAction as MyAction 

scriptName = str(MyAction.getResource('/com/example/action/myAction.py')) 
scriptStr = MyAction.getResourceAsStream('/com/example/action/myAction.py') 

try: 
    print execfile(scriptStr) 
except: 
    print "failed 1" 

try: 
    print execfile(scriptName) 
except: 
    print "failed 2" 

इनमें से दोनों विफल रहे। मुझे अब कुछ नुकसान हुआ है कि मुझे आगे कैसे बढ़ना चाहिए। कोई विचार ?

चियर्स,

ट्रेवर

+0

क्या हैं 'scriptName' और' scriptStr' की सामग्री? जार फ़ाइल में – badp

+0

। जब मैं ज्योथन का आह्वान करता हूं तो क्लासपाथ पर। अगर मैं sys.path प्रिंट करता हूं तो आप इसे वहां देखते हैं। बस पूरी तरह से होने के लिए मैंने sys.path.append() का उपयोग कर सीधे जार को जोड़ने के लिए जार को जोड़ने का प्रयास किया है, लेकिन इससे कोई फर्क नहीं पड़ता। – Trevor

+0

'zipimport' (http://docs.python.org/library/zipimport.html) और नीचे दिए गए उदाहरण पर देखें। जब आप 'init.py' लिखते हैं, तो इसका मतलब है' __init __। Py', है ना? –

उत्तर

5
मेरे लिए

निम्नलिखित काम करता है:

import sys 
import os 

import java.lang.ClassLoader 
import java.io.InputStreamReader 
import java.io.BufferedReader 

loader = java.lang.ClassLoader.getSystemClassLoader() 
stream = loader.getResourceAsStream("com/example/action/myAction.py") 
reader = java.io.BufferedReader(java.io.InputStreamReader(stream)) 

script = ""       
line = reader.readLine() 
while (line != None) : 
    script += line + "\n" 
    line = reader.readLine() 

exec(script) 
  1. स्क्रिप्ट '
  2. कार्यकारी स्क्रिप्ट के साथ में एक स्ट्रिंग के रूप में क्लासपाथ से स्क्रिप्ट लोड हो रहा है exec
+0

यह वास्तव में एक अच्छा जवाब है। मैं कुछ आसान करने की उम्मीद कर रहा था, लेकिन मुझे लगता है कि यह सबसे अच्छा विकल्प होने की संभावना है। – Trevor

+0

हैलो, क्या आप कृपया यह जोड़ सकते हैं कि हम इस स्क्रिप्ट को कैसे चलाना चाहिए। धन्यवाद –