2011-07-08 15 views
17

ओएसएक्स पर पाइथन 2.6.1 चलाना, CentOS पर तैनात होगा। इस तरह एक कमांड लाइन से लागू किया जा करने के लिए एक पैकेज प्राप्त करना चाहते हैं:एक पायथन पैकेज

$PYTHONPATH/ 
    tst/ 
     __init__.py  # empty 
     __main__.py  # below 
     dep.py   # below 

निम्नलिखित है फाइलों में:

python [-m] tst 

कि के लिए, यहाँ निर्देशिका संरचना बनाई गई है

$ cat tst/__main__.py 
from .dep import DepClass 

print "Hello there" 

$ cat tst/dep.py 
class DepClass(object): 
    pass 

$ 

हालांकि, अजगर मुझे नैदानिक ​​परस्पर विरोधी देता है:

$ python -m tst 
/usr/bin/python: tst is a package and cannot be directly executed 

ठीक है, इसलिए इसे एक पैकेज के रूप में पहचाना जाता है। तो मुझे इसे एक स्क्रिप्ट के रूप में चलाने में सक्षम होना चाहिए? यह इस बिंदु मैं खो गया हूँ पर __main__ है ...

$ python tst 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/runpy.py", line 121, in _run_module_as_main 
    "__main__", fname, loader, pkg_name) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/runpy.py", line 34, in _run_code 
    exec code in run_globals 
    File "/Users/vdidenko/Code/emi/tst/__main__.py", line 1, in <module> 
    from .dep import DepClass 
ValueError: Attempted relative import in non-package 

non-package क्यों? और फिर कोड को कैसे व्यवस्थित करें?

+1

[-एम], विभिन्न समाधान के साथ चलते समय एक डुप्ली, अलग-अलग प्रतिक्रिया नहीं। हालांकि करीब लगता है। यह समस्या चलते समय '.__ main__' जोड़ने में विफल रही, दूसरे ने इसे ठीक से जोड़ा। –

उत्तर

28

कमांड लाइन -m विकल्प का उपयोग करते समय पैकेज के __main__ मॉड्यूल को चलाने के लिए सुविधा पायथन 2.7 में पेश की गई थी। 2.6 के लिए आपको चलाने के लिए पैकेज मॉड्यूल नाम निर्दिष्ट करने की आवश्यकता है; -m test.__main__ काम करना चाहिए। प्रलेखन here देखें।

+1

बढ़िया, धन्यवाद! 2.6x में दस्तावेज़ थोड़े अस्पष्ट थे और विभिन्न संस्करणों के बीच भ्रमित करने में मदद नहीं मिली थी। –

+0

//, यह 'python -m pip install argparse' जैसे विवरणों के साथ भी एक समस्या है। –

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