दिलचस्प पोस्ट
Ints के लिए अधिकतम और न्यूनतम मान सी में डेटा स्ट्रक्चर्स को सीरियल करना रेल – एक जावास्क्रिप्ट रनटाइम नहीं मिल सका? पायथन: 'गलत गद्दी' त्रुटि को अनवरोधित करें जब base64 decoding स्ट्रिंग स्ट्रीम को कैसे साफ़ करें? अंतराल द्वारा परिभाषित असतत श्रेणियों में निरंतर संख्यात्मक मानों को कनवर्ट करें PHP छवि अपलोड सुरक्षा जांच सूची मैं विंडोज़ को कैसे स्थापित / सेट अप और सीआरएल का उपयोग करूँ? पायथन द्वारा प्रयुक्त स्ट्रिंग तुलना तकनीक किसी सामग्री के तत्व में एचटीएमएल के साथ चयनित पाठ को कैसे बदलना है? सशर्त क्रिया बटन जोड़ने के लिए नि: शुल्क jqgrid गुणों का उपयोग कैसे करें जावा में दो (2) घुमावदार वर्ग के साथ डेटा कैसे साझा करें कैसे एक धागा को समय समाप्ति के लिए "शब्द-ब्रेक: ब्रेक-ऑल" बनाम "वर्ड-रैप: ब्रेक-वर्ड" सीएसएस में क्या अंतर है? अल्पविराम सी ++ के साथ प्रिंटिंग सूचियां

परस्पर विरोधी निष्पादन योग्य / पथ के साथ Popen

मैं अपने पाइथन स्क्रिप्ट से Popen के उपयोग से "कनवर्ट" यूटिलिटी को कॉल करना चाहता हूं, जैसे:

Popen(["convert", input_path, "-flop", output_file_path]) 

(उपरोक्त उदाहरण केवल छवि को क्षैतिज रूप से उलट देता है)

समस्या यह है कि जब मैं विंडोज़ में स्क्रिप्ट चलाता हूं, तो यह convert.exe उपयोगिता को फोन करता है जो विंडोज़ के साथ convert.exe को NTFS में बदलने के लिए कहता है! (\ Windows \ system32 में स्थित)

अब, अगर मैं सिस्टम 32 के अलावा किसी अन्य डायरेक्टरी पर एक कमांड प्रॉम्प्ट को बेतरतीब ढंग से खोलता हूं, और "कनवर्ट" टाइप करें, तो यह छवि मैजिक एक्जिक्यूटिव को सही तरीके से चलाता है। इसलिए, इसका अर्थ है कि Popen स्वचालित रूप से system32 में देख रहा है। मैं इसे कैसे सिस्टम 32 में नहीं देख सकता, और सही निष्पादन योग्य चला सकता हूँ?

वेब के समाधान से एकत्रित समाधान "परस्पर विरोधी निष्पादन योग्य / पथ के साथ Popen"

एक कार्यक्रम के लिए खोज तुच्छ नहीं है मैं convert.exe निष्पादन योग्य के बजाय स्पष्ट रूप से पूर्ण पथ को निर्दिष्ट करता हूं।

subprocess विंडोज पर CreateProcess का उपयोग करता है जो कि %PATH% में किसी भी अन्य निर्देशिका से पहले system32 निर्देशिका में दिखता है :

… यदि फ़ाइल नाम में कोई एक्सटेंशन नहीं है, तो .exe को जोड़ा गया है। इसलिए, अगर फ़ाइल का नाम एक्सटेंशन .com है, तो इस पैरामीटर में .com एक्सटेंशन शामिल होना चाहिए। यदि फ़ाइल का नाम किसी विस्तार के साथ अवधि (।) में समाप्त होता है, या यदि फ़ाइल नाम में कोई पथ है, तो। Exe संलग्न नहीं है यदि फ़ाइल नाम में एक निर्देशिका पथ नहीं है, तो सिस्टम निम्न क्रम में निष्पादन योग्य फ़ाइल के लिए खोज करता है:

  1. जिस निर्देशिका से एप्लिकेशन लोड किया गया है
  2. मूल प्रक्रिया के लिए वर्तमान निर्देशिका।
  3. 32-बिट विंडोज सिस्टम निर्देशिका। इस निर्देशिका के पथ को प्राप्त करने के लिए GetSystemDirectory फ़ंक्शन का उपयोग करें।
  4. 16-बिट विंडोज सिस्टम निर्देशिका। कोई ऐसा कार्य नहीं है जो इस निर्देशिका के पथ को प्राप्त करता है, लेकिन यह खोजा जाता है। इस निर्देशिका का नाम सिस्टम है
  5. विंडोज निर्देशिका इस निर्देशिका के पथ को प्राप्त करने के लिए GetWindowsDirectory फ़ंक्शन का उपयोग करें।
  6. निर्देशिका जो पथ परिवेश चर में सूचीबद्ध हैं ध्यान दें कि यह फ़ंक्शन एप पथ रजिस्ट्री कुंजी द्वारा निर्दिष्ट प्रति-अनुप्रयोग पथ खोज नहीं करता है। इस खोज-अनुक्रम में प्रति-अनुप्रयोग पथ को शामिल करने के लिए, ShellExecute फ़ंक्शन का उपयोग करें।

इसलिए convert इस मामले में convert.exe बराबर है। यह पहली बार एक निर्देशिका में दिखता है जिसमें sys.executable उदा, C:\Python27 फिर वर्तमान निर्देशिका में: जहां आपने पायथन स्क्रिप्ट शुरू किया था। तब system32 जहां यह कन्वर्ट। Exe (फाइलसिस्टम उपयोगिता, छविमैग्कक नहीं) पाता है।

आप os.environ['PATH'] डायरेक्टरी को os.environ['PATH'] से निकालने का प्रयास कर सकते हैं, यह (?) इसे जांचना रोक सकता है: Popen(cmd, env=no_system32_environ) लेकिन यह कमजोर (स्पष्ट पथ से भी बदतर) है।

अजगर बग ट्रैकर पर एक संबंधित समस्या है: "उपप्रक्रिया विंडोज पर गलत निष्पादन योग्यता उठाती है।"


cmd.exe (शेल) अलग एल्गोरिथ्म का उपयोग करता है। देखें कि कैसे विंडोज़ शेल में इनपुट का पता लगाता है?

यदि आप shell=True सेट करते हैं तो प्रोग्राम को convert लिए खोज क्रम:

  1. convert एक आंतरिक शेल कमांड नहीं है
  2. कोई स्पष्ट पथ नहीं है, इसलिए खोज जारी है
  3. वर्तमान निर्देशिका खोजें
  4. सूचीबद्ध ऑर्डर में पाथ पर्यावरण चर द्वारा निर्दिष्ट प्रत्येक निर्देशिका की खोज करें

%PATHEXT% परिभाषित करता है कि कौन से फ़ाइल एक्सटेंशन की जांच की जाती है और किस क्रम में, जैसे %PATHEXT% .com;.exe;.bat;.cmd %PATHEXT% , %PATHEXT% , %PATHEXT% अगर %PATHEXT% है .com;.exe;.bat;.cmd %PATHEXT% .com;.exe;.bat;.cmd %PATHEXT%

एक पूरी तरह से अलग दृष्टिकोण के रूप में, आप अजगर मैजिक के लिए पायथन PythonMagick कोशिश कर सकते हैं। इस तरह से आप convert के फ़ंक्शन को पायथन से convert सकते हैं, और आपको बाहर की प्रक्रियाओं को अंडे देना नहीं होगा।

बस इस में अपने आप में भाग गया शेल में एक PHP स्क्रिप्ट चलाने से शेल $ PATH तक पहुंच हो सकती है, जबकि अपाचे के भीतर चल रहा है (कम से कम साइगविन डीएलएल / एक्सई के साथ $ पायथ नहीं)।

दूसरे, एक विंडोज़ प्लेटफॉर्म पर पीपीपी के भीतर देशी विंडोज नोटेशन C: / dir / subdir / pgm का उपयोग करें और आप जो अपेक्षा करते हैं वह आपको मिलेगा।

तो मल्टी-प्लेटफॉर्म कोड को स्विच करना / पाथिंग का मामला होना चाहिए और फिर निर्णय का संदर्भ देना होगा।