2011-07-13 11 views
30

मैं कुछ पैकेज आयात करना चाहता हूं, इस पर निर्भर करता है कि उपयोगकर्ता किस मूल्य को चुनता है।

डिफ़ॉल्ट file1.py है: उपयोगकर्ता चुनता

from files import file1 

हैं file2, यह होना चाहिए:

from files import file2 

पीएचपी में, मैं variable variables का उपयोग कर ऐसा कर सकते हैं:

$file_name = 'file1'; 
include($$file_name); 
$file_name = 'file2'; 
include($$file_name); 

मैं पायथन में यह कैसे कर सकता हूं?

+1

ऐसा मत करो! इनपुट का उपयोग आमतौर पर भरोसेमंद और अंधेरा मूल्यांकन कोड पर आधारित नहीं है, यह एक बुरा विचार है। –

+0

धन्यवाद, मैं अब आयात करने के लिए डिफ़ॉल्ट सेट का उपयोग कर रहा हूँ। – skargor

उत्तर

43

अजगर एक सुविधा सीधे है कि नहीं है PHP के "परिवर्तनीय चर" के बराबर। "चर परिवर्तनीय" मान (या किसी अन्य अभिव्यक्ति का मूल्य) प्राप्त करने के लिए आप eval फ़ंक्शन का उपयोग कर सकते हैं।

foo = "Hello World" 
print eval("foo") 

बहरहाल, यह एक import बयान में नहीं किया जा सकता।

एक चर का उपयोग करके आयात करने के लिए __import__ फ़ंक्शन का उपयोग करना संभव है।

package = "os" 
name = "path" 

imported = getattr(__import__(package, fromlist=[name]), name) 

from os import path as imported 
26

Fredrik Lundh states:

के रूप में वैसे भी, यहाँ कैसे इन बयानों और कार्यों काम करते हैं:

import X आयात मॉड्यूल एक्स, और वर्तमान नाम स्थान में है कि मॉड्यूल के लिए एक संदर्भ बनाता है। या दूसरे शब्दों में, के बाद आप इस बयान चलाने के बाद, आप X.name उपयोग कर सकते हैं मॉड्यूल एक्स

from X import * में परिभाषित बातों का उल्लेख करने के मॉड्यूल एक्स आयात करता है, और परिभाषित सभी सार्वजनिक वस्तुओं के लिए वर्तमान नाम स्थान में संदर्भ बनाता है उस मॉड्यूल द्वारा ( , वह सब कुछ है जिसका नाम "_" से शुरू नहीं होता है)। या अन्य शब्दों में, इस कथन को चलाने के बाद, आप मॉड्यूल एक्स में परिभाषित चीजों को संदर्भित करने के लिए बस सादे नाम का उपयोग कर सकते हैं। लेकिन एक्स स्वयं परिभाषित नहीं है, इसलिए X.name काम नहीं करता है। और यदि नाम पहले ही परिभाषित किया गया था, तो यह को नए संस्करण द्वारा प्रतिस्थापित किया गया है। और यदि एक्स में नाम बदल दिया गया है तो को किसी अन्य ऑब्जेक्ट पर बदल दिया गया है, तो आपका मॉड्यूल नोटिस नहीं करेगा।

from X import a, b, c मॉड्यूल एक्स आयात करता है, और दिए गए ऑब्जेक्ट्स को वर्तमान नामस्थान में संदर्भ बनाता है। या दूसरे शब्दों में, आप अब अपने प्रोग्राम में a और b और c का उपयोग कर सकते हैं।

अंत में, import X तरह X = __import__(‘X’) काम करता है, अंतर साथ कि आप 1) एक स्ट्रिंग के रूप मॉड्यूल का नाम पारित, और 2) स्पष्ट रूप से अपने वर्तमान नाम स्थान में एक चर के लिए असाइन करें। ।

और जिस तरह से पिछले एक विधि है कि आप में intrested रहे हैं कि द्वारा

सीधे शब्दों में (उदाहरण के लिए) लिखें:

var = "datetime" 
module = __import__(var) 
+0

स्पष्ट और उत्तर के उत्तर के लिए धन्यवाद। – DrBailey

4

के बराबर है यह शायद उपयोगकर्ता आयात करने के लिए क्या चुनना जाने के लिए एक बहुत बुरा विचार है। पैकेज आयात पर कोड निष्पादित कर सकते हैं, इसलिए आप उपयोगकर्ता को अपने सिस्टम पर मनमाने ढंग से कोड निष्पादित करने की अनुमति दे रहे हैं! ज्यादा सुरक्षित

if user_input == 'file1.py': 
    from files import file1 as file 
elif user_input == 'file2.py': 
    from files import file2 as file 
else: 
    file = None 
    print "Sorry, you can't import that file" 
33

पुराने धागे की तरह कुछ करने के लिए है, लेकिन मैं इस सवाल का जवाब की जरूरत है, तो किसी और अभी भी हो सकता है ...

अजगर में यह करने के लिए एक क्लीनर तरीका 2.7+ नहीं है:

import importlib 


my_module = importlib.import_module("package.path.%s" % module_name) 
+0

युक्ति: आपको [import to work] (http://stackoverflow.com/a/1260813/673991) के लिए 'package.path .__ init __। Py'' की आवश्यकता होगी। –

2

mattjbray के जवाब पर अपने आप को आधार:

from importlib import import_module 

# lookup in a set is in constant time 
safe_names = {"file1.py", "file2.py", "file3.py", ...} 

user_input = ... 

if user_input in safe_names: 
    file = import_module(user_input) 
else: 
    print("Nope, not doing this.") 

कोड की कुछ लाइनें बचाता है, और अनुमति देता है आप safe_names प्रोग्रामेटिक रूप से सेट करने के लिए, या एकाधिक मॉड्यूल लोड करें और उन्हें एक निर्देश के लिए असाइन करें, उदाहरण के लिए।

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