2011-12-15 6 views
8

के तहत एक छोटे पायथन प्रोग्राम (मॉड्यूल नहीं) के लिए उचित स्थापना स्क्रिप्ट मेरे पास पाइथन में एक छोटा प्रोग्राम है जिसमें एक .py फ़ाइल और प्रोग्राम द्वारा उपयोग की जाने वाली डेटा फ़ाइलों की निर्देशिका शामिल है।लिनक्स

मैं लिनक्स पर व्यवस्थापक अधिकार वाले उपयोगकर्ता के लिए एक इंस्टॉलेशन प्रक्रिया बनाने का उचित तरीका जानना चाहता हूं ताकि वह प्रोग्राम को अपने सिस्टम पर इंस्टॉल कर सके और विकल्प और पैरामीटर के साथ कमांड लाइन से इसका उपयोग कर सके। संपादित करें: जिस हिस्से में मुझे परेशानी हो रही है, वह प्रोग्राम है, एक बार स्थापित हो, डेटा फ़ाइलों को पुनर्प्राप्त करें, जो 'डेटा' उप-फ़ोल्डर में निहित है।

एक सेटअप स्क्रिप्ट जो निष्पादन योग्य प्रोग्राम फ़ाइल /usr/local/bin में स्थापित करती है और /usr/share/my_program/data में डेटा फ़ोल्डर स्वीकार्य समाधान हो सकता है? की तरह कुछ:

#!/bin/bash 
# Launch with sudo 
chmod +x program.py 
cp program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation complete 

अब, ऐसा करने के लिए में, मुझे लगता है, इस कार्यक्रम में, है कि डेटा फ़ाइलों /usr/share/my_program/data में होने जा रहे हैं। लेकिन मैं उपयोगकर्ता को इसे इंस्टॉल किए बिना प्रोग्राम का उपयोग करने का विकल्प भी छोड़ दूंगा। तो मुझे यह मानना ​​होगा कि डेटा निष्पादन योग्य प्रोग्राम फ़ाइल के सापेक्ष './data' में है। मुझे इस समस्या को कैसे हल करना चाहिए? मैं कुछ तरीकों से सोच सकता हूं, लेकिन मेरी भावना यह है कि मैं एक गड़बड़ी कर रहा हूं जहां एक स्पष्ट और सही उत्तर होना चाहिए।

वर्तमान में, मैं खंड को छोड़कर एक कोशिश का उपयोग कर पर विचार कर रहा हूँ:

try: 
    find data from /usr/share/my_program && set path accordingly 
except: 
    set path to the data as './data' 

फिर से, मुझे लगता है कि यह थोड़ा जटिल है। आप स्थापना के लिए कैसे आगे बढ़ेंगे?

बहुत धन्यवाद


संपादित करें: समाधान अपनाया

इस सवाल का जवाब के आधार पर, और सवाल FakeRainBrigand (How to know the path of the running script in Python?) ने सुझाव दिया में उन लोगों के लिए, मैं एक स्क्रिप्ट स्थापित बनाया है कि इस तरह जाता है:

#!/bin/bash 
mkdir /usr/share/my_program 
chmod +x my_program.py 
cp my_program.py /usr/local/bin 
cp -r data /usr/share/my_program 
echo Installation completed 

और मेरे प्रोग्राम में निम्न कोड जोड़ा गया:

if os.path.dirname(__file__) == "/usr/local/bin": 
    DATA_PATH = "/usr/share/my_program/data" 
elif os.path.dirname(__file__) == ".": 
    DATA_PATH = "./data" 
else: 
    print "You do not have a working installation of my_program" 
    print "See the installation procedure in the README file" 
    sys.exit(1) 

मैं तो os.path.join(DATA_PATH, "file-to-reach.txt") का उपयोग करें ताकि कार्यक्रम यह डेटा, /usr/share/my_program के नीचे पाया पहुँच सकते हैं।

यदि अधिक स्वीकार्य विधि उपलब्ध है तो मुझे टिप्पणियां खुशी होगी।

चीयर्स

+0

'मेक' सिर्फ सी से कहीं अधिक है, लेकिन पाइथन प्रोग्राम में जगह से बाहर हो सकता है। – sarnold

उत्तर

11

Am मैं गलत है कि setup.py विधि (यानी: setup.py स्थापित अजगर), केवल मॉड्यूल स्थापित करने के लिए, बाद में दुभाषिया या अन्य लिपियों के भीतर से इस्तेमाल किया जा रहा है?

हां। तुम गलत हो।

आप पाइथन की स्क्रिप्ट निर्देशिका में स्थापित कर सकते हैं। setup.py सभी चीजों पर पढ़ना जारी रखें। http://docs.python.org/distutils/setupscript.html#installing-scripts

यह वास्तव में बहुत ही सरल है। और इसमें पाइथन के साथ कुछ लेना देना नहीं है।

एक पायथन स्क्रिप्ट कहीं से भी चलाया जा सकता है। लिनक्स आपको निष्पादन योग्य फ़ाइल (/path/to/my_program.py) चलाने योग्य बनाने के तरीकों की विस्तृत, विस्तृत विविधता देता है।

उन सभी विस्तृत, विस्तृत विविध तरीकों में तीन चीजें आम हैं। लिनक्स के लिए केंद्रीय तीन चीजें हैं और पाइथन के साथ कुछ भी नहीं है।

  1. फ़ाइल उपयोगकर्ता के PATH पर होना चाहिए।

  2. फ़ाइल में "निष्पादित" विशेषाधिकार होना चाहिए (chmod +x ...)।

  3. फ़ाइल #!/usr/bin/env python से शुरू होनी चाहिए।

यह कैसे होता है?

# 1 के लिए।

  • आप पाथ की जांच कर सकते हैं और फ़ाइल को पाथ पर किसी भी निर्देशिका में डाल सकते हैं। इसके लिए बहुत सारे मानक विकल्प हैं। उदाहरण के लिए /usr/local/bin

  • आप कुछ नई निर्देशिका को शामिल करने के लिए उपयोगकर्ता के पथ को संशोधित कर सकते हैं। /path/to, उदाहरण के लिए, /path/to/my_program.py पाया जा सकता है।

# 2 के लिए। आप उपयुक्त chmod +x निष्पादित करते हैं।

# 3 के लिए। आप कोड की उचित रेखा लिखते हैं।

अधिक जानकारी के लिए "लिनक्स शैल" पर पढ़ें। सभी "खोल" कार्यक्रमों में एक ही तीन विशेषताएं हैं। bashcsh, python, perl, आदि, आदि, आदि


जबकि, ./data/this_file.dat के रूप में उन्हें की बात कर उदाहरण के लिए, डेटा फ़ाइलें, एक 'डेटा' उप फ़ोल्डर में निहित पुनः प्राप्त।

यह एक खराब डिजाइन होगा।

लिनक्स (पायथन के बाहर) उपयोगी डेटा फ़ाइलों को खोजने के कई तरीके प्रदान करता है।

  1. उन्हें ज्ञात पथ के साथ एक ज्ञात स्थान पर स्थापित करें। दिमाग में आता है। यह सबसे अच्छा स्थान नहीं हो सकता है, लेकिन यह काफी लोकप्रिय है।

  2. पर्यावरण चर का उपयोग करें। MYAPP_HOME, उदाहरण के लिए, फ़ाइल के स्थान पर सेट किया जा सकता है। आप os.path.join(os.environ['MYAPP_HOME'], 'data', 'this_file.dat') का उपयोग कर सकते हैं बहुत लोकप्रिय।

  3. अपनी स्क्रिप्ट कहां स्थित है, यह जानने के लिए __file__ चर का उपयोग करें।तब निर्देशिका का पता लगाने और साथ os.path.join(this_directory, 'data', 'this_file.dat')

+0

हाय एसएलट आपकी सलाह के लिए धन्यवाद। मैं आपके द्वारा उल्लेख किए गए तीन चरणों (पथ, निष्पादन योग्य बिट और शेबांग!) से अवगत हूं। हालांकि, इस ज्ञान का उपयोग करके, मैं प्रोग्राम को काम नहीं कर सकता, यह जानकर कि इसे उप-फ़ोल्डर 'डेटा' में कुछ फ़ाइलों का उपयोग करना चाहिए। चूंकि मैं वर्तमान में नहीं जानता कि उपयोगकर्ता प्रोग्राम कहां रखेगा, मैं कोड में फ़ोल्डर के पथ को 'हार्डकोड' नहीं कर सकता (जो कि किसी भी मामले में एक बहुत बुरा विचार है)। मैं एक इंस्टॉलेशन प्रक्रिया की तलाश में हूं जो दोनों प्रोग्राम फ़ाइल को पथ में पाएंगे और डेटा को इंगित करना संभव होगा: './data/this_file.dat'। मुझे कैसे आगे बढ़ना चाहिए? – Morlock

+0

@ मॉरलॉक: "चूंकि मैं वर्तमान में नहीं जानता कि उपयोगकर्ता प्रोग्राम कहां रखेगा"। यह आपके हिस्से पर एक गलती होगी। चूंकि यह आपका ** असली ** प्रश्न है, कृपया ** ** ** ** ** ** ** ** ** आपके ** वास्तविक ** समस्या का वर्णन शामिल करने के लिए प्रश्न अपडेट करें। इसके अलावा, कृपया कुछ और पाइथन दस्तावेज देखें। आप जो भी जानकारी चाहते हैं वह वास्तव में उपलब्ध है। उदाहरण के लिए वैश्विक चर '__file__', बहुत सारी जानकारी प्रदान करेगा। –

+0

प्रश्न अद्यतन। मुझे लगता है कि वास्तविक प्रश्न आपके साथ और FakeRainBrigand के संवाद के परिणामस्वरूप उभर रहा है। आपके अद्यतन के लिए धन्यवाद। मुझे लगता है कि मेरे पास अब आवश्यक सभी विकल्प हैं और आपके द्वारा सुझाए गए मार्गों के बारे में और अधिक पढ़ेंगे। – Morlock

2

आप इस तरह के डेटाबेस या सेटिंग्स कॉन्फ़िगर करने की आवश्यकता है कि के रूप में कोई बाहरी निर्भरता, है, तो एक सरल setup.sh स्क्रिप्ट करना चाहिए डेटा पथ इकट्ठा करने के लिए os.path का उपयोग करें।

DIR=`pwd` 
NAME=my_app.py 
echo "#!/usr/bin/env sh 
python $DIR/my_app.py" > /usr/sbin/$NAME 
chmod a+x /usr/sbin/$NAME 

यह आपकी आवश्यकताओं के आधार पर अधिक जटिल हो सकता है।

+0

मुझे तर्क दिखाई देता है, लेकिन यह मुझे मेरी प्रोग्राम फ़ाइल (प्रोग्राम_फोल्डर/डेटा के तहत) की आवश्यक फ़ाइलों का उपयोग करने की अनुमति कैसे देगा? मैं निष्पादन योग्य/usr/local/bin के तहत रखूंगा, लेकिन 'डेटा' फ़ोल्डर के बारे में क्या होगा? धन्यवाद। – Morlock

+0

शायद डेटा के लिए एक आरक्षित निर्देशिका है जहां मैं डेटा फाइल डाल सकता हूं और उन्हें वहां रहने की उम्मीद कर सकता हूं?/Usr/share/my_program? क्या ऐसा करने के लिए एक अच्छा अभ्यास है और फिर मेरी स्क्रिप्ट में इन फ़ाइलों का स्थान हार्डकोड करें, जो/usr/local/bin में होगा? यह सच होने के लिए बहुत आसान लगता है :) मेरी चिंता है कि मेरे भविष्य के कार्यक्रमों के लिए ऐसा करने का एक उचित तरीका सीखना। – Morlock

+0

@ मॉरलॉक, उन्हें रखने के लिए वास्तव में कोई * सही * जगह नहीं है। उन्हें छोड़ने के लिए यह पूरी तरह से स्वीकार्य है जहां उपयोगकर्ता उन्हें रखता है। [यहां जवाब] आपको अपने डेटा फ़ोल्डर में मदद करने में मदद कर सकता है। – FakeRainBrigand

0

आप एक निष्पादन योग्य ज़िप फ़ाइल बना सकते हैं जिसमें आपकी स्क्रिप्ट और डेटा फ़ाइलों का उपयोग होता है। एक इंस्टॉलेशन को सिर्फ $PATH में इस फ़ाइल को कहीं भी रखने की आवश्यकता है और इसे निष्पादन योग्य बनाएं: chmod +x my-program

python: can executable zip files include data files?

आप एक उपयुक्त setup.py अपने डेटा फ़ाइलों को स्थापित करने के लिए कैसे और स्क्रिप्ट तो वहाँ कई और अधिक विकल्प कार्यक्रम जैसे स्थापित करने के लिए कर रहे हैं निर्दिष्ट करता है कि बनाते हैं, तो

$ pip install --user http://example.com/your-program.tar.gz 

जहां pip स्थापित किया जा सकता सिस्टम पैकेजर के माध्यम से, your-program.tar.gz आप python setup.py sdist का उपयोग कर बना सकते हैं।