2013-10-28 8 views
10

के माध्यम से एक पायथन स्क्रिप्ट लॉन्च करना मेरे पास एक निष्पादन योग्य पायथन स्क्रिप्ट है जो "स्क्रिप्ट" निर्देशिका में मौजूद है, और मूल निर्देशिका में उस स्क्रिप्ट (फ़ाइल को लॉन्च करने के लिए उपयोग किया जाता है) का एक प्रतीकात्मक लिंक है। कुछ की तरह:एक प्रतीकात्मक लिंक

. 
├── scripts 
│ ├── const.py 
│ ├── fops.py 
│ ├── i_build.py 
│ └── i_Props.ini 
└── build_i -> scripts/i_build.py 

मैं के माध्यम से शुरू करने के लिए/मेरी स्क्रिप्ट चलाने में सक्षम होना चाहते हैं:

python build_i 

रूट निर्देशिका से। I_build.py स्क्रिप्ट i_Props.ini खोलने का प्रयास करेगा और वहां पर मौजूद कुछ के आधार पर कुछ जादू करेगी।

समस्या यह है कि जब i_build.py स्क्रिप्ट रूट निर्देशिका में symlink के माध्यम से लॉन्च की जाती है, i_build.py स्क्रिप्ट अन्य फ़ाइलों के लिए मूल निर्देशिका में दिखाई देगी (नहीं/स्क्रिप्ट निर्देशिका जहां i_build.py है संग्रहीत)। विफल रहता है

PROP_FILE = "i_Props.ini" 

और उस को खोलने के लिए प्रयास करता है, और उसके बाद:

i_build.py फ़ाइल रंगमंच की सामग्री के रूप में स्थान फ़ाइल है। मैं स्पष्ट कारणों से पथ को हार्डकोड नहीं करना चाहता हूं।

मुख्य फ़ाइल में os.getcwd() जोड़ने वाला एक त्वरित परीक्षण मेरे संदेह की पुष्टि करता है कि ऐसा लगता है कि सीडब्ल्यूडी रूट निर्देशिका है, और __file__ की जांच का कहना है कि यह प्रतीकात्मक लिंक ("build_i") है।

क्या कोई ऐसा कुछ भी है जो पाइथन __file__ नाम और सीडब्ल्यूडी के लिए प्रतीकात्मक गंतव्य का उपयोग करने के लिए कर सकता है?

+0

आप शायद अन्य ऑपरेटिंग सिस्टम पर जोकुछ/जो भी हो, का उपयोग कर फाइल सिस्टम की निगरानी कर सकते हैं। अंततः दो स्थानों को अलग करने वाली चीज इनोड हो सकती है जो निष्पादन शुरू करती है। इनमें से कोई भी कुछ खोदने के बिना बहुत स्पष्ट रूप से उजागर नहीं हुआ है .. एकमात्र अन्य चीज जो मैं सोच सकता हूं वह नरम लिंक की बजाय एक कठिन लिंक होगा, लेकिन मुझे लगता है कि इसका विपरीत प्रभाव हो सकता है। एक शेल चाल है जो आप कर सकते हैं, मेरा मानना ​​है कि जेड शैल में 'प्रोग्राम चलाने से पहले' हुक है जो आपके वास्तविक सीडब्ल्यूडी को स्क्रिप्ट को एक तर्क के रूप में खिला सकता है? .. – synthesizerpatel

+0

यह एक उत्तर के योग्य नहीं है इसलिए मैं ' मैं टिप्पणी कर रहा हूँ। आप 'os.readlink()' का उपयोग करके सिम्लिंक पढ़ सकते हैं, और परिणाम से स्क्रिप्ट को 'subprocess.Popen() 'के साथ चला सकते हैं। थोड़ा उलझन में, लेकिन नौकरी को कुछ भी कड़ी मेहनत नहीं करता है और यह निर्भरता को जोड़ता नहीं है। – ThinkChaos

+0

संबंधित: [मैं पाइथन में वर्तमान निष्पादित फ़ाइल का मार्ग कैसे प्राप्त करूं?] (Http://stackoverflow.com/q/2632199/4279) – jfs

उत्तर

1

बस कुछ संभावनाएं मन में वसंत:

  1. रूट निर्देशिका में एक खोल फ़ाइल है कि आपके अजगर स्पष्ट पथ द्वारा स्क्रिप्ट कॉल की है।
  2. निर्देशिका जोड़ें जो यह आपके पथ में रहता है।
  3. विशेष रूप
+0

विकल्प 1 मेरा काम हो सकता है ... 2 और 3 अनिवार्य रूप से हैं हार्डकोडिंग अभी भी।मुझे किसी भी चीज से बचने की ज़रूरत है जिसमें अतिरिक्त कदम शामिल हैं क्योंकि यह कई लोगों को वितरित किया जाता है, कम env vars जो बेहतर से गड़बड़ कर रहे हैं। – Mike

+0

लिनक्स पर यदि आप bash स्क्रिप्ट को/etc या/bin या/usr/etc में जोड़ते हैं तो यह पथ प्रदान किए बिना निष्पादन योग्य होगा। –

13

sys.path को आप __file__ उपयोग कर सकते हैं निर्देशिका जोड़ने के लिए, लेकिन आप कुछ सावधानी बरतने की वास्तविक पथ प्राप्त करने के लिए:

import os 
base_dir = os.path.dirname(os.path.realpath(__file__)) 

फिर अपने अन्य फ़ाइलों/संसाधनों रिश्तेदार लोड base_dir:

some_subdir = 'my_subdir' 
some_file = 'my.ini' 

ini_path = os.path.join(base_dir, some_subdir, some_file) 
+1

['__file__' को अपरिभाषित किया जा सकता है] (http://stackoverflow.com/q/2632199/4279) आप [इस मामले में' sys.argv [0] 'पर फॉलबैक कर सकते हैं] (https://bitbucket.org/ PyPy/PyPy/src/a299cd0a893f/PyPy/उपकरण/autopath.py? = डिफ़ॉल्ट # सीएल -29 पर) – jfs

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