2012-05-11 9 views
6

जावा को 1.6 से 1.7 x64 (विंडोज 7 पर) को अपग्रेड करने के बाद, अचानक मैं पाइथन 2.7 के subprocess मॉड्यूल के माध्यम से java.exe लॉन्च नहीं कर सकता। बस के लिए इस्तेमाल किया निम्न स्क्रिप्ट काम:पाइथन subprocess के माध्यम से java.exe निष्पादित क्यों नहीं कर सकता?

Traceback (most recent call last): 
    File ".\tst.py", line 2, in <module> 
    subprocess.check_call([r"C:\Windows\system32\java.exe"]) 
    File "C:\Python27\lib\subprocess.py", line 506, in check_call 
    retcode = call(*popenargs, **kwargs) 
    File "C:\Python27\lib\subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "C:\Python27\lib\subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 896, in _execute_child 
    startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 

मैं भी पुष्टि की है कि C:\Windows\system32\java.exe वास्तव में मौजूद है, एक आवेदन पत्र है, और आदेश शेल से क्रियान्वित किया जा सकता:

import subprocess 
subprocess.check_call([r"C:\Windows\system32\java.exe"]) 

अब यह इस तरह विफल रहता है ।

क्या गलत है?

संपादित करें: मैंने पाया कि मैं अजगर से C:\Program Files\Java\jre7\bin\java.exe शुरू कर सकते हैं, तो C:\Windows\system32\java.exe कुछ अजीब छद्म शॉर्टकट हालांकि तकनीकी रूप से एक विंडोज़ अनुप्रयोग होना चाहिए। संस्करण 1.7 ने इसे किसी भी तरह से गड़बड़ कर दिया होगा, क्योंकि मैंने अभी पुष्टि की है कि संस्करण 1.6 ठीक है।

+1

क्या आप वाकई एक लिंक नहीं हैं? – Marcin

+1

@Marcin फ़ाइल गुणों के अनुसार फ़ाइल प्रकार 'एप्लिकेशन (.exe) 'है। – aknuds1

+0

यह ... अजीब है। – Marcin

उत्तर

8

मान लिया जाये कि एक java.exe है कि वहाँ "C: \ Windows \ System32" एक विशेष रूप से सुरक्षित धारणा नहीं है। यहां तक ​​कि धारणा है कि सिस्टम पर "सी: \ विंडोज \ सिस्टम 32" सुरक्षित नहीं है: विंडोज कंप्यूटर पर किसी भी निश्चित ड्राइव पर रह सकता है।

लेकिन वहाँ है, भले ही एक "C: \ Windows \ System32 \ java.exe", इस Win64 के तहत 32-बिट प्रक्रियाओं के लिए दिखाई नहीं हो सकता है। विंडोज पीछे की संगतता के नाम पर कुछ रोचक चीजें करता है, तो आप http://en.wikipedia.org/wiki/WoW64 को देखना चाहेंगे।

जावा संस्करण ढूंढना जिसे आप ढूंढ रहे हैं - और कई हो सकते हैं - एक कृतज्ञ कार्य हो सकता है। यदि आप विशेष रूप से पर ध्यान नहीं देते हैं जो जावा आपको मिलता है, तो JAVA_HOME पर्यावरण चर का प्रयास करें। यह हमेशा वहां नहीं होता है, लेकिन यदि ऐसा है, तो आप कर चुके हैं और यह शायद JVM खोजने का सबसे पोर्टेबल तरीका है। यदि यह वहां नहीं है, तो आप इसे सेट करके गलत नहीं जा सकते हैं, और कई जावा एप्लिकेशन उस चर का उपयोग कर सकते हैं।

फिर, जावा सिर्फ पथ पर हो सकता है, जिसमें मामले सब कुछ लेकिन उपप्रक्रिया कॉल चाल करना होगा में 'जावा' शब्द को हटा। कोशिश करने के लिए यह चोट नहीं पहुंचा सकता है।

+1

नहीं है कारण C: \ Windows \ System32 \ java.exe मेरे लिए प्रासंगिक था कि यह कैसे मैं आमतौर पर 'PATH', मैं सीधे उस पर भरोसा नहीं करते के माध्यम से java.exe लगता है वह यह है कि निष्पादन योग्य पथ लेकिन आप WoW64 के बारे में कुछ भी हो सकते हैं, मैं जांच करूंगा, धन्यवाद। – aknuds1

+2

आप कुछ पर थे। 32-बिट पायथन के साथ निम्नलिखित निष्पादित करते समय 'गलत' मुद्रित किया गया है, लेकिन 64-बिट पायथन के लिए 'True':' python.exe -c "आयात os.path; प्रिंट os.path.exists (r'C: \ windows \ system32 \ java.exe ') "'। 64-बिट विंडोज़ पर स्पष्ट रूप से 32-बिट ऐप्स को C: \ Windows \ System32 से C: \ Windows \ SysWOW64 से रीडायरेक्ट किया जाता है, जहां कोई java.exe नहीं है। – aknuds1

+0

एसओ पर हर समय उत्तर के शीर्ष वोटों में से एक क्यों नहीं है? –

0

तुम भी यदि पथ वातावरण चर JRE के बिन पथ के आसपास उद्धरण चिह्न है "" जांच करना चाह सकते। पाइथन उन्हें पसंद नहीं करता है:

C:\bin>set PATH=C:\Python27;c:\Program Files\Java\jdk1.6.0_35\bin 

    C:\bin>python -c "import subprocess; subprocess.Popen(['java', '-version'], stderr=subprocess.PIPE)" 

    C:\bin>set PATH=C:\Python27;"c:\Program Files\Java\jdk1.6.0_35\bin" 

    C:\bin>python -c "import subprocess; subprocess.Popen(['java', '-version'], stderr=subprocess.PIPE)" 
    Traceback (most recent call last): 
    [...] 
    WindowsError: [Error 2] The system cannot find the file specified 

    C:\bin> 
संबंधित मुद्दे