2011-12-02 15 views
85

मैं foo-bar.py आयात करना चाहता हूं। यह काम करता है:मॉड्यूल नाम में '-' डैश या हाइफ़न होने पर मॉड्यूल आयात करने के लिए कैसे करें?

foobar = __import__("foo-bar") 

यह नहीं करता है:

from "foo-bar" import * 

मेरा प्रश्न: वहाँ किसी भी तरह से है कि मैं जैसे कि, from "foo-bar" import * एक मॉड्यूल उस में एक - है कि आयात करने के लिए ऊपर प्रारूप का उपयोग कर सकते है?

+6

क्यों आप एक साथ एक मॉड्यूल की क्या ज़रूरत है इसके नाम पर डैश? –

+11

मुझे लगता है कि यह मूल रूप से एक मॉड्यूल के बजाय एक स्क्रिप्ट के रूप में लिखा गया था। –

+0

संभवतः डुप्लिकेट [पाइथन मॉड्यूल के साथ एक डैश, या हाइफ़न (-) के नाम पर] (http://stackoverflow.com/questions/7583652/python-module-with-a-dash-or-hyphen-in-its -नाम) –

उत्तर

64

आप नहीं कर सकते। foo-bar पहचानकर्ता नहीं है। करने के लिए foo_bar.py

संपादित फ़ाइल का नाम बदलें: तो import अपने लक्ष्य नहीं है: केवल फ़ाइल के के सभी हो रही (में के रूप में आप परवाह नहीं है क्या sys.modules के साथ होता है, तो आप इसे अपने आप में आयात करने की आवश्यकता नहीं है), अपनी खुद की गुंजाइश में वैश्विक, आप execfile

# contents of foo-bar.py 
baz = 'quux' 
>>> execfile('foo-bar.py') 
>>> baz 
'quux' 
>>> 
+2

+1 यह सबसे सीधा-आगे तय है। –

+10

पायथन 3.x [पायथन 3.0 में नया क्या है] (https://docs.python.org/3/whatsnew/3.0.html) execfile() हटा दिया गया। 'Execfile (fn) '' 'exec' (open (fn) .read()) के बजाय 'पैकेज आयात आयात भी है। – DevPlayer

64

उपयोग कर सकते हैं आप मॉड्यूल नामकरण परंपराओं का अजगर मैच के लिए नाम नहीं बदल सकते हैं, तो एक नया मॉड्यूल एक मध्यस्थ के रूप में कार्य करने के बनाने के लिए:

---- foo_proxy.py ---- 
tmp = __import__('foo-bar') 
globals().update(vars(tmp)) 

---- main.py ---- 
from foo_proxy import * 
+13

मैं इसे कभी लागू नहीं करूंगा। लेकिन मैं इस हैक – inspectorG4dget

+5

की सरासर प्रतिभा के लिए +1 नहीं दे सकता हूं, आप वास्तव में 'foo_proxy.py' फ़ाइल के बिना ऐसा कर सकते हैं, '__import __ (...)' 'sys.modules [' 'के आउटपुट को असाइन करें। foo_proxy '] '। असल में, ऐसा मत करो, यह एक भयानक विचार है। – SingleNegationElimination

+2

बस कूल बस जो मैं खोज रहा था। एक प्रयोगशाला है, यदि कोई देशी पुस्तकालयों का उपयोग करता है जो वितरण के साथ भेजे जाते हैं। – Sven

32

आप मूल फ़ाइल का नाम नहीं कर सकते हैं, तो आप भी एक सिमलिंक इस्तेमाल कर सकते हैं:

ln -s foo-bar.py foo_bar.py 

तो फिर तुम सिर्फ कर सकते हैं:

from foo_bar import * 
+0

यह बहुत हैकी है, लेकिन साथ ही बहुत साफ है। – user1767754

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