PyLint "आयात करने में असमर्थ" त्रुटि - PYTHONPATH कैसे सेट करें?


165

मैं विंडोज पर विंग आईडीई के अंदर से PyLint चला रहा हूं। मेरी परियोजना में एक उप-निर्देशिका (पैकेज) है और पैकेज के अंदर मैं शीर्ष स्तर से एक मॉड्यूल आयात करता हूं, अर्थात।

__init__.py
myapp.py
one.py
subdir\
    __init__.py
    two.py

अंदर two.pyमेरे पास है import oneऔर यह रनटाइम पर ठीक काम करता है, क्योंकि शीर्ष-स्तरीय निर्देशिका (जिसमें myapp.pyसे चलाया जाता है) पायथन पथ में है। हालाँकि, जब मैं दो एलडीएल पर PyLint चलाता हूं तो यह मुझे एक त्रुटि देता है:

F0401: Unable to import 'one'

मैं यह कैसे तय करुं?

जवाबों:


145

ऐसे दो विकल्प हैं जिनसे मैं अवगत हूं।

एक, PYTHONPATHअपने मॉड्यूल के ऊपर निर्देशिका को शामिल करने के लिए पर्यावरण चर को बदलें ।

वैकल्पिक रूप से, ~/.pylintrcअपने मॉड्यूल के ऊपर निर्देशिका को शामिल करने के लिए संपादित करें , जैसे:

[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'

(या pylint के अन्य संस्करण में, init-हुक के लिए आपको [सामान्य] को [MASTER] में बदलने की आवश्यकता होती है)

इन दोनों विकल्पों पर काम करना चाहिए।

उम्मीद है की वो मदद करदे।


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

2
मैं एक ही मुद्दा है MacVim का उपयोग वाक्य-विन्यास के साथ करना। आयात त्रुटि को ठीक करने के लिए मैं अभियोजक को कैसे कॉन्फ़िगर कर सकता हूं?
लॉरेंट


~/.pylintrcOSX पर मेरे लिए काम किया, दूसरे ने काम नहीं किया
Miquel

सुनिश्चित नहीं हैं कि क्यों यह स्वीकार किए जाते हैं जवाब नहीं है - यह भी, इस पर ठोकर उन लोगों के लिए उल्लेख के लायक है, कि तुम करने की जरूरत है export PYTHONPATHताकि pylintइसे देखेंगे (कम से कम, बैश / zsh में)
मार्को Massenzio

43

रास्ते को बदलने का उपाय init-hookअच्छा है, लेकिन मैं इस तथ्य को नापसंद करता हूं कि मुझे वहां पूर्ण पथ जोड़ना होगा, जिसके परिणामस्वरूप मैं इस pylintrc फ़ाइल को परियोजना के डेवलपर्स के बीच साझा नहीं कर सकता। Pylintrc फ़ाइल के सापेक्ष पथ का उपयोग करने वाला यह समाधान मेरे लिए बेहतर काम करता है:

[MASTER]
init-hook="from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"

ध्यान दें कि pylint.config.PYLINTRCमौजूद भी है और उसी के समान मूल्य है find_pylintrc()


1
पुष्टि करते हुए कि यह वास्तव में E0611 और E0401 पाइलिंट त्रुटियों के समाधान की आपूर्ति करता है। VSCode उपयोगकर्ताओं के लिए: यह महत्वपूर्ण है कि खोला गया फ़ोल्डर "अजगर रूट फ़ोल्डर" है, और उस फ़ोल्डर में .pylintrc है।
np8

यह भी सुनिश्चित करें कि आपका कोई भी मॉड्यूल निर्देशिका नाम .(डॉट) से शुरू न हो ।
सॉ-मोन और नताली

2
यदि आप एक विशिष्ट उप-फ़ोल्डर जोड़ना चाहते हैं (यानी app) तो आप उपयोग कर सकते हैंfrom pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.join(os.path.dirname(find_pylintrc()), 'app'))
chachan

27

1) sys.path एक सूची है।

2) समस्या कभी-कभी sys.path आपकी virtualenv.path नहीं होती है और आप अपने virtualenv में pylint का उपयोग करना चाहते हैं

3) जैसा कहा गया है, इनिट-हुक का उपयोग करें (और ध्यान दें कि "पाइलिंट का पक्षा सख्त है)

[Master]
init-hook='sys.path = ["/path/myapps/bin/", "/path/to/myapps/lib/python3.3/site-packages/", ... many paths here])'

या

[Master]
init-hook='sys.path = list(); sys.path.append("/path/to/foo")'

.. तथा

pylint --rcfile /path/to/pylintrc /path/to/module.py

8
मैं स्थापित करके इस तय कर दी है लग रहा था pylint: इस सलाह के अनुसार के रूप में मेरे virtualenv में plaidzooks.tumblr.com/post/36813101879
मैट

3
यह महान काम करता है, और शीर्ष उत्तर होना चाहिए। यदि आपके पास -pylintrc सेट नहीं है तो बस pylint --generate-rcfile > .pylintrcअपने होम फोल्डर में एक त्वरित कार्य करना सुनिश्चित करें ।
reka18

26

वेलेव के तहत पाइलिंट पथ को कॉन्फ़िगर करके समस्या को हल किया जा सकता है: $ cat .vscode / settings.json

{
    "python.pythonPath": "venv/bin/python",
    "python.linting.pylintPath": "venv/bin/pylint"
}

2
विंडोज के लिए यह { "python.pythonPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe" "python.linting.pylintPath": "${workspaceFolder}\\.venv\\Scripts\\pylint.exe" } सिर्फ पूर्णता के लिए है।
रॉय २५११

प्रश्न इस संपादक से नहीं माँगता।
इवैलो बार्डारोव

VSCode अब यह संदेश दिखाता है: The setting "python.pythonPath" defined in your settings.json is now deprecated. यदि मैं उस python.pythonPathपंक्ति को हटा देता हूं जो अभी भी काम करती है, तब भी लगता है।
जेसी एल्ड्रिज

23

क्या आपके पास __init__.pyदोनों निर्देशिकाओं में एक खाली फ़ाइल है जो अजगर को बताती है कि डायर मॉड्यूल हैं?

जब आप फ़ोल्डर के भीतर से नहीं चल रहे हों, तो मूल रूपरेखा (यानी शायद pylint की, हालांकि मैंने उसका उपयोग नहीं किया है) है:

topdir\
  __init__.py
  functions_etc.py
  subdir\
    __init__.py
    other_functions.py

यह इस तरह है कि अजगर दुभाषिया मॉड्यूल के बारे में पता करने के लिए वर्तमान निर्देशिका के संदर्भ के बिना है, इसलिए यदि पाइलिंट अपने स्वयं के निरपेक्ष पथ से चल रहा है, तो यह या के functions_etc.pyरूप में उपयोग करने में सक्षम होगा , बशर्ते कि है ।topdir.functions_etctopdir.subdir.other_functionstopdirPYTHONPATH

अद्यतन: यदि समस्या __init__.pyफ़ाइल नहीं है , तो शायद अपने मॉड्यूल को कॉपी करने या स्थानांतरित करने की कोशिश करें c:\Python26\Lib\site-packages- जो कि अतिरिक्त पैकेज डालने के लिए एक सामान्य जगह है, और निश्चित रूप से आपके pythonpath पर होगी। यदि आप जानते हैं कि विंडोज प्रतीकात्मक लिंक या समतुल्य कैसे करें (मैं नहीं!), तो आप इसके बजाय ऐसा कर सकते हैं। यहां कई और विकल्प हैं: http://docs.python.org/install/index.html , जिसमें आपके विकास कोड की उपयोगकर्ता-स्तरीय निर्देशिका के साथ sys.path को जोड़ने का विकल्प शामिल है, लेकिन व्यवहार में मैं आमतौर पर सिर्फ प्रतीकात्मक रूप से लिंक करता हूं मेरा स्थानीय विकास साइट-पैकेजों के लिए जाना जाता है - इसे कॉपी करने का समान प्रभाव पड़ता है।


1
हां, मेरे पास __init__.pyदोनों निर्देशिकाओं में हैं। मुझे लगता है कि समस्या यह है कि शीर्ष डायर PYTHONPATH में नहीं है जब PyLint चलता है और मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए।
EMP

सिम्लिंक एक अच्छा विचार है, लेकिन यह केवल विंडोज विस्टा से समर्थित है और मैं XP चला रहा हूं। मुझे लगता है कि मैं इसे कड़ी से कड़ी जोड़ने की कोशिश कर सकता था ...
EMP

पुनः हार्डलिंकिंग: नहीं, आप बेहतर नहीं करते। मैंने इसके साथ खेला है और, जबकि यह निश्चित रूप से (एक तरह से) काम करता है, यह आपकी अपेक्षा के अनुरूप काम नहीं करेगा।
शीलेंट

प्रतीक एक अच्छा विचार नहीं हैं। यह केवल आपकी मशीन पर समस्या को ठीक करता है - जब कोई अन्य परियोजना की जांच करता है, तो यह उनके लिए टूट जाएगा।
जोनाथन हार्टले


5

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

PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f"

जहाँ% f फ़ाइल नाम है, और% d पथ है। किसी के लिए उपयोगी हो सकता है :)


4

मुझे PYTHONPATHअपना App Engine पाथ जोड़ने के लिए सिस्टम वैरिएबल को अपडेट करना था । मेरे मामले में मुझे सिर्फ अपनी ~/.bashrcफ़ाइल को संपादित करना था और निम्नलिखित पंक्ति को जोड़ना था:

export PYTHONPATH=$PYTHONPATH:/path/to/google_appengine_folder

वास्तव में, मैंने init-hookपहली बार सेटिंग करने की कोशिश की लेकिन इससे मेरे कोड बेस पर लगातार समस्या का समाधान नहीं हुआ (निश्चित नहीं कि क्यों)। एक बार जब मैंने इसे सिस्टम पथ (शायद सामान्य रूप से एक अच्छा विचार) में जोड़ा तो मेरे मुद्दे दूर हो गए।


3

एक वर्कअराउंड जो मैंने अभी-अभी खोजा है, वह वास्तव में केवल एक फ़ाइल के बजाय पूरे पैकेज के लिए PyLint चलाना है। किसी तरह, यह तब आयातित मॉड्यूल खोजने का प्रबंधन करता है।


बहुत अच्छा लगता है; कैसे?
सेसम टिम्मरमैन

1
@CeesTimmerman pylint ... dirमूल फ़ोल्डर से चलाएँ । यह फ़ाइलों के __init__.pyसाथ प्रत्येक सबफ़ोल्डर में मौजूद होना चाहिए .py
yugr

3

प्रयत्न

if __name__ == '__main__':
    from [whatever the name of your package is] import one
else:
    import one

ध्यान दें कि पायथन 3 में, elseखंड में भाग के लिए वाक्यविन्यास होगा

from .. import one

दूसरे विचार पर, यह संभवतः आपकी विशिष्ट समस्या को ठीक नहीं करेगा। मैंने इस प्रश्न को गलत समझा और सोचा कि टू-डीएम मुख्य मॉड्यूल के रूप में चलाया जा रहा है, लेकिन ऐसा नहीं है। और अजगर 2.6 (आयात किए बिना रास्ते में मतभेद पर विचार absolute_importसे __future__और अजगर 3.x संभाल आयात), तुम वैसे भी अजगर 2.6 के लिए ऐसा करने की जरूरत नहीं होगी, मुझे नहीं लगता कि।

फिर भी, यदि आप अंततः पायथन 3 पर जाते हैं और पैकेज मॉड्यूल के रूप में और पैकेज के अंदर एक स्टैंडअलोन स्क्रिप्ट के रूप में एक मॉड्यूल का उपयोग करने की योजना बनाते हैं, तो कुछ ऐसा रखना एक अच्छा विचार हो सकता है।

if __name__ == '__main__':
    from [whatever the name of your package is] import one   # assuming the package is in the current working directory or a subdirectory of PYTHONPATH
else:
    from .. import one

दिमाग में।

संपादित करें: और अब आपकी वास्तविक समस्या के संभावित समाधान के लिए। या तो अपने oneमॉड्यूल युक्त निर्देशिका से पाइलिंट चलाएं (कमांड लाइन के माध्यम से, शायद), या निम्नलिखित कोड कहीं भी डाल दें जब एलएलएल चला रहे हों:

import os

olddir = os.getcwd()
os.chdir([path_of_directory_containing_module_one])
import one
os.chdir(olddir)

मूल रूप से, PYTHONPATH के साथ फ़िडलिंग के विकल्प के रूप में, बस यह सुनिश्चित करें कि one.pyजब आप आयात करते हैं तो वर्तमान कार्यशील निर्देशिका वह निर्देशिका होती है ।

(ब्रायन के उत्तर को देखते हुए, आप शायद पिछले कोड को असाइन कर सकते हैं init_hook, लेकिन यदि आप ऐसा करने जा रहे हैं, तो आप बस उसी के लिए आवेदन कर सकते हैं sys.path, जो मेरे समाधान से थोड़ा अधिक सुरुचिपूर्ण है।)


2

कुंजी अपनी परियोजना निर्देशिका को sys.pathएन वी चर के बारे में विचार किए बिना जोड़ना है ।

VSCode का उपयोग करने वाले व्यक्ति के लिए, यदि आपके प्रोजेक्ट का आधार निर्देशिका है, तो यहां आपके लिए एक-लाइन समाधान उपलब्ध है:

[MASTER]
init-hook='base_dir="my_spider"; import sys,os,re; _re=re.search(r".+\/" + base_dir, os.getcwd()); project_dir = _re.group() if _re else os.path.join(os.getcwd(), base_dir); sys.path.append(project_dir)'

मुझे इसे थोड़ा समझाने दो:

  • re.search(r".+\/" + base_dir, os.getcwd()).group(): संपादन फ़ाइल के अनुसार आधार निर्देशिका खोजें

  • os.path.join(os.getcwd(), base_dir): जोड़ने cwdके लिए sys.pathमिलने कमांड लाइन पर्यावरण के लिए


FYI करें, यहाँ मेरा .pylintrc:

https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f


2

मेरे पास यह एक ही मुद्दा था और इसे अपने virtualenv में pylint स्थापित करके और फिर फ़ाइल में निम्नलिखित के साथ मेरी परियोजना निर्देशिका में एक .pylintrc फ़ाइल जोड़कर तय किया:

[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'

मुझे यह पुष्टि करनी है कि यह E0611 पाइलिंट त्रुटियों से छुटकारा दिलाता है, लेकिन E0401 त्रुटियां बनी हुई हैं।
np8

1

शायद PYTHONPATH के अंदर डीआईआर को मैन्युअल रूप से जोड़कर?

sys.path.append(dirname)

हम्म, लेकिन आप उस कोड को कहां रखेंगे? प्रत्येक फ़ाइल के शीर्ष पर? मुझे लगता है कि यह काम करेगा, लेकिन यह सिर्फ काम करने के लिए PyLint पाने के लिए काफी हैक है।
ईएमपी

@Evgeny: जवाब देखें कि ब्रायन एम। हंट ने हाल ही में पोस्ट किया है।
JAB

और हर फ़ाइल के शीर्ष पर इसे जोड़ना किसी कारण से काम नहीं करता है - PyLint किसी भी संशोधन को sys.path को अनदेखा करने के लिए पूरी तरह से सामग्री लगती है जो कि इसे स्कैन करने वाले मॉड्यूल के भीतर से बनाई गई है। हालांकि, मैंने इस पर शोध करने की
जहमत नहीं उठाई

1

मुझे भी यही समस्या थी और जब से मुझे कोई जवाब नहीं मिला, मुझे उम्मीद है कि यह इसी तरह की समस्या के साथ किसी को भी मदद कर सकता है।

मैं एपिलिंट के साथ फ्लाईमाके का उपयोग करता हूं। मूल रूप से मैंने जो किया था वह एक dired- मोड-हुक को जोड़ा गया था जो यह जांचता है कि क्या direth python पैकेज डायरेक्टरी है। अगर मैं इसे PYTHONPATH में जोड़ दूं। मेरे मामले में मैं एक निर्देशिका को एक अजगर पैकेज मानता हूं यदि इसमें "setup.py" नाम की एक फ़ाइल होती है।

;;;;;;;;;;;;;;;;;
;; PYTHON PATH ;;
;;;;;;;;;;;;;;;;;

(defun python-expand-path ()
  "Append a directory to the PYTHONPATH."
  (interactive
   (let ((string (read-directory-name 
          "Python package directory: " 
          nil 
          'my-history)))
     (setenv "PYTHONPATH" (concat (expand-file-name string)
                  (getenv ":PYTHONPATH"))))))

(defun pythonpath-dired-mode-hook ()
  (let ((setup_py (concat default-directory "setup.py"))
    (directory (expand-file-name default-directory)))
    ;;   (if (file-exists-p setup_py)
    (if (is-python-package-directory directory)
    (let ((pythonpath (concat (getenv "PYTHONPATH") ":" 
                  (expand-file-name directory))))
      (setenv "PYTHONPATH" pythonpath)
      (message (concat "PYTHONPATH=" (getenv "PYTHONPATH")))))))

(defun is-python-package-directory (directory)
  (let ((setup_py (concat directory "setup.py")))
    (file-exists-p setup_py)))

(add-hook 'dired-mode-hook 'pythonpath-dired-mode-hook)

उम्मीद है की यह मदद करेगा।


1

यदि कोई पाइकार्म में एक बाहरी उपकरण के रूप में पाइलिंट को चलाने के लिए एक रास्ता खोज रहा है और क्या यह अपने आभासी वातावरण (क्यों मैं इस सवाल पर आया था) के साथ काम करता है, तो यहां मैंने इसे हल किया है:

  1. PyCharm में> वरीयताएँ> उपकरण> बाहरी उपकरण, pylint के लिए एक आइटम जोड़ें या संपादित करें।
  2. एडिट टूल डायलॉग टूल टूल में, पायथन इंटरप्रेटर डाइरेक्टरी से पाइलिंट का उपयोग करने के लिए प्रोग्राम सेट करें: $PyInterpreterDirectory$/pylint
  3. पैरामीटर फ़ील्ड में अपने अन्य पैरामीटर सेट करें, जैसे: --rcfile=$ProjectFileDir$/pylintrc -r n $FileDir$
  4. अपनी वर्किंग डायरेक्टरी को सेट करें $FileDir$

अब pylint को एक बाहरी उपकरण के रूप में उपयोग करने से जो भी निर्देशिका आपने एक सामान्य कॉन्फ़िगर फ़ाइल का उपयोग करके चुनी है उस पर pylint चलेगा और अपनी परियोजना के लिए जो भी दुभाषिया कॉन्फ़िगर किया गया है उसका उपयोग करें (जो संभवतः आपका virtualenv दुभाषिया है)।


1

यह एक पुराना प्रश्न है, लेकिन इसका कोई स्वीकृत उत्तर नहीं है, इसलिए मैं इसका सुझाव दूंगा: पढ़ने के लिए दो कथन में आयात विवरण बदलें:

from .. import one

मेरे वर्तमान परिवेश में (पायथन 3.6, Vylode pylint 2.3.1 का उपयोग करके) यह ध्वजांकित कथन को साफ करता है।


1

मुझे एक अच्छा जवाब मिला । अपने pylintrc संपादित करें और मास्टर में निम्नलिखित जोड़ें

init-hook="import imp, os; from pylint.config import find_pylintrc; imp.load_source('import_hook', os.path.join(os.path.dirname(find_pylintrc()), 'import_hook.py'))"

1

जब आप पायथन को स्थापित करते हैं, तो आप पथ सेट कर सकते हैं। यदि पथ पहले से परिभाषित है, तो आप वीएस कोड के भीतर क्या कर सकते हैं, Ctrl + Shift + P दबाएं और पायथन टाइप करें: इंटरप्रेटर चुनें और पायथन के अपडेटेड संस्करण का चयन करें। अधिक जानकारी के लिए इस लिंक का अनुसरण करें, https://code.visualstudio.com/docs/python/en परिवेश


0

यदि आप vscode का उपयोग करते हैं, तो सुनिश्चित करें कि आपकी पैकेज निर्देशिका _pychache__ निर्देशिका से बाहर है।


वीएस कोड के साथ, फ़ोल्डर नामों में डॉट के साथ संभावित मुद्दे प्रतीत होते हैं: github.com/PyCQA/pylint/issues/2182
Eric Burel

0

यदि आप लिनक्स में साइथॉन का उपयोग कर रहे हैं, तो मैंने module.cpython-XXm-X-linux-gnu.soअपने प्रोजेक्ट लक्ष्य निर्देशिका में फ़ाइलों को हटाने का समाधान किया ।


0

बस इस कोड को .vscode / settings.json फ़ाइल में जोड़ें

, "python.linting.pylintPath": "वेनव / बिन / पाइलिंट"

यह पाइलिंट के स्थान को सूचित करेगा (जो अजगर के लिए एक त्रुटि चेकर है)


-1

हैलो, मैं विभिन्न निर्देशिका से संकुल आयात करने में सक्षम था। मैंने अभी निम्नलिखित कार्य किया है: नोट: मैं VScode का उपयोग कर रहा हूं

पायथन पैकेज बनाने के लिए पायथन पैकेज के साथ काम करना वास्तव में सरल है। आपको बस इतना करना है:

एक निर्देशिका बनाएं और इसे अपने पैकेज का नाम दें। इसमें अपनी कक्षाएं लगाएं। निर्देशिका में init .py फ़ाइल बनाएँ

उदाहरण के लिए: आपके पास एक फ़ोल्डर है जिसे फ्रेमवर्क कहा जाता है, जहाँ आप सभी कस्टम वर्ग रख रहे हैं और आपका काम फ्रेमवर्क नामक फ़ोल्डर के अंदर सिर्फ एक init .py फ़ाइल बनाना है ।

और आयात करते समय आपको इस फैशन में आयात करना होगा --->

फ्रेमवर्क आयात बेस से

तो E0401 त्रुटि गायब हो जाती है फ्रेमवर्क वह फ़ोल्डर है जहाँ आपने सिर्फ init .py बनाया है और आधार आपका कस्टम मॉड्यूल है जिसे आपको आयात करने की आवश्यकता है और आशा है कि यह मदद करता है !!!!

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