मॉड्यूल का आयात कैसे करें जब मॉड्यूल नाम में '-' डैश या हाइफ़न हो?


194

मैं foo-bar.py आयात करना चाहता हूं। यह काम:

foobar = __import__("foo-bar")

यह नहीं करता:

from "foo-bar" import *

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


10
आपके पास इसके नाम के डैश के साथ मॉड्यूल क्यों है?
मैटी विर्ककुनेन

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


Win32com की @MattiVirkkunen makepy.py इसमें डैश के साथ मॉड्यूल उत्पन्न करेगा। बहुत बुरा। comtypes ने इसे अंडरस्कोर में परिवर्तित करके हल किया
swdev

2
@MattiVirkkunen मुझे लगता है कि पायथन को उन नामों को सीमित नहीं करना चाहिए जिन्हें मैं अपनी निर्देशिका दे सकता हूं। ऐसा करना उसकी जिम्मेदारी नहीं है।
ज़ेल्फिर कल्टस्टाहल

जवाबों:


116

आप नहीं कर सकते। foo-barकोई पहचानकर्ता नहीं है। करने के लिए फ़ाइल का नाम बदलेंfoo_bar.py

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

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

24
Python 3.x नया क्या है Python 3.0 में निष्कासित निष्पादन ()। execfile(fn)उपयोग के बजाय इसके exec(open(fn).read())अलावा पैकेज importlib है।
DevPlayer

105

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

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

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

28
मैं इसे कभी लागू नहीं करूंगा। लेकिन मैं इस हैक के सरासर प्रतिभा के लिए +1 नहीं दे सकता हूं
इंस्पेक्टरगैजेट

11
आप वास्तव में बिना ऐसा कर सकता है foo_proxy.pyफ़ाइल, के उत्पादन में आवंटित __import__(...)करने के लिए sys.modules['foo_proxy']। वास्तव में, ऐसा मत करो, यह एक भयानक विचार है।
एकलकरण

3
मैं जो चाह रहा था, उसे ही ठंडा करें। एक usecase है, अगर कोई देशी लाइब्रेरी का उपयोग करता है जिसे वितरण के साथ भेज दिया जाता है।
स्वेन


46

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

ln -s foo-bar.py foo_bar.py

तो आप बस कर सकते हैं:

from foo_bar import *

2

अन्य ने कहा कि आप अजगर के नामकरण में "-" का उपयोग नहीं कर सकते हैं, कई वर्कअराउंड हैं, एक ऐसा वर्कअराउंड जो उपयोगी होगा यदि आपको एक पथ से कई मॉड्यूल जोड़ना पड़ रहा है sys.path

उदाहरण के लिए यदि आपकी संरचना इस प्रकार है:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

import barfoo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.