क्या उन्हें आयात करने की कोशिश करते समय पायथन फ़ाइलों में डैश का उपयोग करना ठीक है?


149

मूल रूप से जब मेरे पास एक अजगर फ़ाइल है जैसे:

python-code.py

और उपयोग करें:

import (python-code)

दुभाषिया मुझे वाक्यविन्यास त्रुटि देता है।

यह कैसे तय करें पर कोई विचार है? अजगर फ़ाइल नामों में डैश अवैध हैं?

जवाबों:


167

आपको PEP 8 , पायथन कोड के लिए स्टाइल गाइड की जाँच करनी चाहिए :

पैकेज और मॉड्यूल नाम मॉड्यूल में छोटे, सभी-लोअरकेस नाम होने चाहिए। यदि यह पठनीयता में सुधार करता है तो अंडरस्कोर मॉड्यूल के नाम में उपयोग किया जा सकता है। पायथन पैकेज में भी छोटे, सभी-लोअरकेस नाम होने चाहिए, हालांकि अंडरस्कोर का उपयोग हतोत्साहित किया जाता है।

चूँकि मॉड्यूल नामों को नाम दर्ज करने के लिए मैप किया जाता है, और कुछ फ़ाइल सिस्टम असंवेदनशील होते हैं और लंबे नामों को काटते हैं, इसलिए यह महत्वपूर्ण है कि मॉड्यूल नामों को काफी छोटा चुना जाए - यह यूनिक्स पर कोई समस्या नहीं होगी, लेकिन यह एक हो सकता है समस्या जब कोड को पुराने मैक या विंडोज संस्करणों या डॉस में ले जाया जाता है।

दूसरे शब्दों में: अपनी फ़ाइल का नाम बदलें :)


75
समस्या का स्टाइल से कोई लेना-देना नहीं है, यह सिंटैक्स त्रुटि है

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

5
जब आप स्पष्ट रूप से आयात को रोकना चाहते हैं तो पायथन निर्देशिका और फ़ाइल नामों में हाइफ़न का उपयोग करना बहुत सहायक हो सकता है। उदाहरण के लिए (कहते हैं) एक Django परियोजना, आपके पास पाइथन में लिखी गई स्क्रिप्ट हो सकती है जो अनुप्रयोगों के रूप में पता योग्य नहीं होनी चाहिए। आप इन्हें किसी फ़ोल्डर में रख सकते हैं ops-scriptsऔर जान सकते हैं कि इन्हें सामान्य पैकेज नेमस्पेस दृष्टिकोण का उपयोग करके आयात नहीं किया जा सकता है। या एक ही स्क्रिप्ट को stop-website.pyएक समान प्रभाव के लिए नामित किया जा सकता है । इनमें से किसी को अभी भी runpyऔर कुछ अन्य तरीकों से आयात किया जा सकता है , लेकिन यह कुछ सामान्य त्रुटियों से बचने में मदद करता है।
क्रिस जॉनसन

एक मॉड्यूल का नाम बदलना समस्याग्रस्त हो सकता है, खासकर यदि आप दूसरे मानक पर भरोसा कर रहे हैं। मेरे मामले में, मैं cgi-binफ़ोल्डर में अजगर cgi फ़ाइलों का उपयोग कर रहा हूं (उन पर unitttests कर रहा है), जो बहुत मानक afaik है। जब तक आपके पास इस तरह का एक दुर्लभ मामला नहीं है, निश्चित रूप से अपने मॉड्यूल का नाम बदलें यदि आपके पास इस पर नियंत्रण है।
न्यूक्लियरपेयन

1
मुझे अभी पता चला है कि PyDev निर्देशिका नामों को हाइफ़न के साथ अनुमति देगा, लेकिन उन निर्देशिका में निहित .py फ़ाइलों में कक्षाएं और / या आंतरिक चर नहीं दिखाएंगे।
user5920660

123

आपके कोड में एक और बात ध्यान देने वाली है कि आयात एक फ़ंक्शन नहीं है। तो ऐसा import(python-code)होना चाहिए import python-code, जैसा कि कुछ ने पहले ही उल्लेख किया है, "आयात अजगर ऋण कोड" के रूप में व्याख्या की गई है, न कि आप क्या करना चाहते हैं। यदि आपको वास्तव में इसके नाम से डैश के साथ फ़ाइल आयात करने की आवश्यकता है, तो आप निम्न कार्य कर सकते हैं ::

python_code = __import__('python-code')

लेकिन, जैसा कि ऊपर भी बताया गया है, यह वास्तव में अनुशंसित नहीं है। यदि आपको ऐसा कुछ नियंत्रित करना है तो आपको फ़ाइल नाम बदलना चाहिए।


@KevinAudleman क्या आपके पास हाइफ़न की गई फ़ाइल के साथ आयात लिब का उपयोग करने का एक कार्यशील उदाहरण है? मैंने कोशिश की और असफल रहा।
टॉम हेल

@TomHale importlib.import_module ('abmodule-1') को काम करना चाहिए। यदि आपका import_module काम नहीं करता है, तो मुझे लगता है कि एक सामान्य आयात भी काम नहीं करेगा।
इयान लिन

64

TLDR

डैश अवैध नहीं हैं , लेकिन आपको उन्हें 3 कारणों से उपयोग नहीं करना चाहिए:

  1. आपको डैश के साथ फ़ाइलों को आयात करने के लिए विशेष सिंटैक्स की आवश्यकता होती है
  2. कोई भी डैश के साथ मॉड्यूल नाम की उम्मीद नहीं करता है
  3. यह पायथन स्टाइल गाइड की सिफारिशों के खिलाफ है

यदि आपको निश्चित रूप से डैश के साथ फ़ाइल नाम आयात करने की आवश्यकता है, तो विशेष सिंटैक्स यह है:

module_name = __import__('module-name')

इस बारे में उत्सुक कि हमें विशेष वाक्यविन्यास की आवश्यकता क्यों है?

विशेष वाक्य रचना का कारण यह है कि जब आप लिखते import somenameहैं somenameतो आप पहचानकर्ता के साथ एक मॉड्यूल ऑब्जेक्ट बना रहे हैं (ताकि आप बाद में इसका उपयोग कर सकते हैं जैसे somename.funcname)। बेशक module-nameएक मान्य पहचानकर्ता नहीं है और इसलिए विशेष वाक्यविन्यास जो एक वैध देता है।

आपको पता नहीं है कि मॉड्यूल-नाम मान्य पहचानकर्ता क्यों नहीं है?

चिंता न करें - मैंने भी नहीं किया। आपकी सहायता करने के लिए यहां एक टिप दी गई है: इस अजगर लाइन को देखें x=var1-var2:। क्या आपको असाइनमेंट के दाईं ओर एक घटाव या डैश के साथ एक चर नाम दिखाई देता है?

पुनश्च

मेरे उत्तर में मूल कुछ भी नहीं है, सिवाय इसके कि मैं एक स्थान पर अन्य सभी उत्तरों से सूचना के सबसे प्रासंगिक बिट्स को क्या मानता हूं


मैं इस आयात का उपयोग करने की कोशिश कर रहा हूँ इसमें एक हाइफ़न के साथ एक पाइप पैकेज। psycopg2_binary = import_module('psycopg2-binary')। त्रुटि => ModuleNotFoundError: No module named 'psycopg2-binary'। लेकिन psycopg2-binaryस्थापित है। इसे शामिल करने का कोई विचार नहीं है।
मोर्ट ज़ार्ट सिप

शायद यह एक पथ मुद्दा है। पर देखो chrisyeh96.github.io/2017/08/08/...
ndemou

32

समस्या यह है कि python-codeपहचानकर्ता नहीं है। पार्सर इसे pythonमाइनस के रूप में देखता है code। बेशक यह वह नहीं होगा जो आप पूछ रहे हैं। आपको एक फ़ाइल नाम का उपयोग करने की आवश्यकता होगी जो एक मान्य अजगर पहचानकर्ता है। -एक अंडरस्कोर के साथ बदलने की कोशिश करें ।


4
+1। कभी नहीं सोचा था कि पायथन स्रोत कोड का फ़ाइल नाम एक मान्य पहचानकर्ता होना चाहिए, क्योंकि फ़ाइल नाम का उपयोग मॉड्यूल ऑब्जेक्ट को संदर्भित करने के लिए किया जाएगा।
एंडी

5

आप शायद इसे कुछ __import__हैक के माध्यम से आयात कर सकते हैं , लेकिन यदि आप पहले से ही नहीं जानते हैं कि आपको कैसे नहीं करना चाहिए। पायथन मॉड्यूल नाम वैध चर नाम ("पहचानकर्ता") होना चाहिए - इसका मतलब है कि यदि आपके पास एक मॉड्यूल है foo_bar, तो आप इसे पायथन ( print foo_bar) के भीतर से उपयोग कर सकते हैं । आप एक अजीब नाम ( print foo-bar-> वाक्यविन्यास त्रुटि) के साथ ऐसा करने में सक्षम नहीं होंगे ।



1

हालांकि उचित फ़ाइल नामकरण सबसे अच्छा कोर्स है, अगर python-codeहमारे नियंत्रण में नहीं है , तो एक हैकिंग का उपयोग __import__कॉपी करने, नाम बदलने या अन्यथा अन्य लेखकों के कोड के साथ गड़बड़ करने से बेहतर है। हालाँकि, मैंने कोशिश की और यह तब तक काम नहीं किया जब तक कि मैंने .pyएक्सटेंशन को जोड़ते हुए फ़ाइल का नाम नहीं बदला । को देखने के बाद दस्तावेज़ कैसे के लिए एक विवरण प्राप्त करने के लिए प्राप्त करने के लिए .py, मैं इस के साथ समाप्त हो गया:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

इसने python-codecपहली बार एक नई फाइल बनाई ।

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