अजगर में, फ़ाइल नाम आयात करने के लिए एक नंबर से शुरू होता है


84

मूल रूप से एक फ़ाइल है जिसे 8puzzle.pyमैं फ़ाइल को किसी अन्य फ़ाइल में आयात करना चाहता हूं (उसी फ़ोल्डर में और मैं फ़ाइल का नाम नहीं बदल सकता क्योंकि फ़ाइल प्रदान की गई है)। वैसे भी पाइथन में ऐसा करने के लिए क्या है? मैंने सामान्य तरीके से कोशिश की from 8puzzle import *, यह मुझे एक त्रुटि देता है।

त्रुटि है:

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 

12
लोग क्यों कहते हैं "यह मुझे [एक] त्रुटि देता है" और फिर पोस्ट नहीं कि त्रुटि क्या है?
जॉन Zwinck

7
@ जॉनहिनक यह एक सिंटैक्स त्रुटि है। मैं अनुमान लगा रहा हूं क्योंकि "8puzzle" एक वैध पहचानकर्ता नहीं है (यह एक संख्या से शुरू होता है), और आयात विवरण के लिए वाक्यविन्यास वहाँ एक पायथन पहचानकर्ता की अपेक्षा करता है। जो उत्तर "नहीं, आप नहीं कर सकते हैं। मॉड्यूल को किसी ऐसी चीज का नाम दें जो एक पत्र या अंडरस्कोर से शुरू होता है।"
मिलीमोसे

जॉन ने अच्छी बात कही, मैं ध्यान रखूंगा। और धन्यवाद अभिजीत मेरे लिए त्रुटि संदेश जोड़ें। धन्यवाद।
साइमन गुओ

1
नाम बदलें 8puzzle.pyकरने के लिए puzzle8.pyऔर उपयोग import puzzle8
बकुरीउ

यह भी देखें stackoverflow.com/questions/6811902/...
tripleee

जवाबों:


96

तुम यह कर सकते थे

puzzle = __import__('8puzzle')

बहुत ही रोचक समस्या। मुझे याद है कि किसी नंबर के साथ कुछ भी नाम नहीं है।

यदि आप चाहते हैं import *- आपको इस प्रश्न और उत्तर की जांच करनी चाहिए ।


1
बहुत अच्छा काम करता है! धन्यवाद। हाँ, मैं इसे एक नंबर से शुरू करने का नाम नहीं दूंगा, लेकिन यह एक कोर्स असाइनमेंट हैंडआउट फ़ाइल है, इसलिए मैं नाम नहीं बदल सकता। लेकिन ऐसा लगता है कि इससे कोई फर्क नहीं पड़ता क्योंकि हम पहले ही इसके लिए समाधान प्राप्त कर चुके हैं। एक बार फिर धन्यवाद।
साइमन गुओ

4
दुनिया को बचाने में मदद करें, या कम से कम अपने सहपाठियों को। यदि आपको एक असंभव आयात सौंपा गया है, तो उसे प्रशिक्षक के ध्यान में लाएं। हाँ, कभी-कभी वे गलत होने से नफरत करते हैं, लेकिन अगर आपको यह समस्या हो रही है, तो हर कोई ऐसा है और यद्यपि यह जवाब काम करता है, यह सही समाधान नहीं है (जब तक कि क्लास "ओब्सेस्ड पाइथन 101" नहीं है)।
msw

1
एक बेहतर तरीका (अजगर 2.7 के साथ कम से कम) 'importlib' मॉड्यूल का उपयोग करने के लिए है: पहेली = importlib.import_module ('
Cédric

3
इसके लिए वास्तव में एक अच्छा उपयोग मामला है - संकलन / उत्पादन प्रक्रिया के भाग के रूप में, अजगर मॉड्यूल को एक साथ जोड़ना अगर लेक्सिग्राफिकल रूप में नामित किया जाता है (आमतौर पर यह कोई फर्क नहीं पड़ता, लेकिन शीर्ष पर स्थिरांक और आयात होता है, 'यदि नाम नीचे, इसलिए '0' से शुरू होने वाले कुछ मॉड्यूल उपयोगी हो सकते हैं।) इस तरह के एक असामान्य निर्देशिका लेआउट को डीबग करने में भी उपयोगी है, जब इनोटिफ़ या वॉच के साथ संयुक्त होता है, जैसे कुछ: watch -n .1 'cat * | अजगर ', जो आपके अजगर ऐप को एक सेकंड के हर दसवें (या कम से कम जितनी जल्दी हो सके) लोड करेगा, या: बिल्ली $ (खोजें। -name "* .py")। अजगर
fatal_error

1
पार्टी के लिए देर से, लेकिन एक और उपयोग का मामला एलेम्बिक पलायन से आयात कर रहा है, क्योंकि वे सभी यादृच्छिक हैश के साथ शुरू होते हैं
केवलर

35

उपरोक्त उत्तर सही हैं, लेकिन अभी के लिए, अनुशंसित तरीका import_moduleफ़ंक्शन का उपयोग करना है:

importlib.import_module(name, package=None)
एक मॉड्यूल आयात करें। नाम तर्क निर्दिष्ट पूर्ण या संबंधित मामले में आयात करने के लिए क्या मॉड्यूल (जैसे या तो pkg.modया ..mod)। यदि नाम सापेक्ष रूप में निर्दिष्ट किया गया है, तो पैकेज तर्क को उस पैकेज के नाम पर सेट किया जाना चाहिए जो पैकेज नाम (जैसे import_module('..mod', 'pkg.subpkg')आयात करेगा pkg.mod) को हल करने के लिए लंगर के रूप में कार्य करना है ।

Import_module () फ़ंक्शन एक सरलीकृत आवरण के रूप में कार्य करता है importlib.__import__()। इसका मतलब है कि फ़ंक्शन के सभी शब्दार्थ से लिया गया है importlib.__import__()। इन दो कार्यों के बीच सबसे महत्वपूर्ण अंतर यह है कि import_module()निर्दिष्ट पैकेज या मॉड्यूल (जैसे pkg.mod) __import__()लौटाता है , जबकि शीर्ष स्तर के पैकेज या मॉड्यूल (उदा pkg) को लौटाता है ।

यदि आप डायनामिक रूप से एक मॉड्यूल आयात कर रहे हैं जो दुभाषिया के निष्पादन के बाद से बनाया गया था (उदाहरण के लिए, पायथन स्रोत फ़ाइल बनाई गई), तो आपको invalidate_caches()आयात प्रणाली द्वारा देखे जाने वाले नए मॉड्यूल के लिए कॉल करने की आवश्यकता हो सकती है।

__import__ अब अनुशंसित नहीं है।

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
अंतर्निहित __import__()फ़ंक्शन का एक कार्यान्वयन ।

नोट import_module()इस फ़ंक्शन के बजाय मॉड्यूल के प्रोग्रामेटिक आयात का उपयोग करना चाहिए ।


यह धन्यवाद का काम करता है, लेकिन यह एक नंबर के साथ शुरू होने वाली इन फाइलों में से एक के अंदर एक फ़ंक्शन या चर आयात करने के लिए काम नहीं करता है। अगर मैं करता हूं: an_imported_file = importlib.import_module('13_file')तो मैं नहीं कर सकता from an_imported_file import var_x। क्या ऐसा कुछ है जो इसे प्राप्त करने के लिए किया जा सकता है?
मार्टिन

/usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in <module> from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
मार्टिन

इसके अलावा, Pycharm में लाइन `a_imported_file आयात var_x` से लाल रंग में रेखांकित किया गया है ...
मार्टिन

मुझे खेद नहीं है। मेरी सामान्य सलाह यह है कि ऐसा करने से बचें।
laike9m

0

.pyअपने आयात में विस्तार का उपयोग न करें ।

from 8puzzle import *काम करता है ?

जो इसके लायक है, from x import *वह एक पसंदीदा पायथन पैटर्न नहीं है, क्योंकि यह उस मॉड्यूल के नाम स्थान को आपके वर्तमान संदर्भ में उड़ा देता है।

सामान्य तौर पर, उन चीजों को आयात करने का प्रयास करें जिन्हें आप विशेष रूप से उस मॉड्यूल से चाहते हैं। अन्य मॉड्यूल से किसी भी वैश्विक आयात किया जा सकता है।

उदाहरण के लिए, यदि आपके पास 8puzzle.foo8puzzle आयात से `कर सकता है

संपादित करें:

जबकि मेरा .pyसंदेश सही है, यह पर्याप्त नहीं है।

दूसरे पोस्टर का __import__('8puzzle')सुझाव सही है। हालांकि, मैं अत्यधिक इस पैटर्न से बचने की सलाह देता हूं

एक के लिए, यह एक आंतरिक, निजी पायथन विधि आरक्षित है। आप मूल रूप से बुनियादी धारणाओं को तोड़ रहे हैं कि इसका क्या मतलब है कि मॉड्यूल आयात करने में सक्षम होना चाहिए। बस फ़ाइल को किसी और चीज़ में बदलना, जैसे puzzle8, यह उपाय करेगा।

यह अनुभवी पायथन प्रोग्रामर से नरक को बाहर निकाल देगा, जो यह जानने की उम्मीद कर रहे हैं कि आपके आयात शीर्ष पर हैं और कोड की उम्मीद कर रहे हैं (कोशिश करें) PEP8 के अनुरूप हैं ।


1
भ्रामक के बारे में खेद है। मैंने जो किया था from 8puzzle import *और मैंने अपना मूल प्रश्न संपादित किया। और यह mvanveen कहा के रूप में काम नहीं करता है।
साइमन गुओ

वह मेरा बुरा है। मैं भूल गया कि मॉड्यूल फ़ाइल नाम witha नंबर शुरू नहीं कर सकता। मैंने एक संपादन पोस्ट किया है।
mvanveen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.