PyLint “İçe aktarılamıyor” hatası - PYTHONPATH nasıl ayarlanır?


165

PyLint'i Windows'ta Wing IDE içinden çalıştırıyorum. Projemde bir alt dizin (paket) var ve paketin içinde üst düzey yani bir modül ithal.

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

İçimde two.pyvar import oneve bu çalışma zamanında iyi çalışıyor, çünkü üst düzey dizin ( myapp.pyçalıştırıldığı) Python yolunda. Ancak, iki.py PyLint çalıştırdığınızda bana bir hata veriyor:

F0401: Unable to import 'one'

Bunu nasıl düzeltirim?

Yanıtlar:


147

Farkında olduğum iki seçenek var.

Birincisi, PYTHONPATHortam değişkenini modülünüzün üzerindeki dizini içerecek şekilde değiştirin .

Alternatif olarak, ~/.pylintrcaşağıdaki gibi modülünüzün üstündeki dizini içerecek şekilde düzenleyin :

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

(Ya da başka bir pylint versiyonunda, init-hook [General] 'i [MASTER] olarak değiştirmenizi gerektirir)

Bu seçeneklerin her ikisi de çalışmalıdır.

Umarım yardımcı olur.


8
Bu pylint kancası şu anda VScode'da en iyi yoldur, çünkü PYTHONPATH linter kullanımında henüz desteklenmemektedir.
Danny Staple

2
Ben de sözdizimsel MacVim kullanarak aynı sorunu var. Prosector'u içe aktarma hatasını düzeltecek şekilde nasıl yapılandırabilirim?
Laurent

Birkaç ayrıntı içeren ilgili blog yazısı .
Christian Long

~/.pylintrcOSX'te benim için çalıştı, diğeri işe yaramadı
Miquel

Emin değil bu kabul cevap değil neden - Ayrıca, değer bu konuda tökezleyerek olanlar için söz sen gerektiğini export PYTHONPATH, böylece pylint(en azından, bash / zsh olarak) bunu görecek
Marco Massenzio

43

Yolu değiştirmek için çözüm init-hookiyi, ama oraya mutlak yol eklemek zorunda olduğumdan hoşlanmıyorum, sonuç olarak bu pylintrc dosyasını projenin geliştiricileri arasında paylaşamıyorum. Pylintrc dosyasına göreceli yol kullanan bu çözüm benim için daha iyi çalışır:

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

pylint.config.PYLINTRCAyrıca var olduğunu ve ile aynı değere sahip olduğunu unutmayın find_pylintrc().


1
Bunun gerçekten E0611 ve E0401 pylint hataları için çözüm sağladığını doğrulamak. VSCode kullanıcıları için: Açılan klasörün "python kök klasörü" olması ve .pylintrc'nin bu klasörde olması önemlidir.
np8

ayrıca, modül dizini adlarınızın hiçbirinin .(dot) ile başlamadığından emin olun .
Saw-mon ve Natalie

2
Belirli bir alt klasör (yani app) eklemek istersenizfrom 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 bir listedir.

2) Sorun bazen sys.path dosyasının virtualenv.pathiniz olmaması ve virtualenv'inizde pylint kullanmak istiyorsunuz

3) Yani dediğimiz gibi, init-hook kullanın (dikkat 've "pylint ayrışması katıdır)

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

veya

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

.. ve

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

8
pylintBu tavsiyeye göre virtualenv'e kurarak bunu düzeltmiş gibiydim
Matt

3
Bu harika çalışıyor ve en iyi cevap olmalı. Ayarlanmış bir .pylintrc ayarlamıyorsanız pylint --generate-rcfile > .pylintrc, ana klasörünüzde hızlı bir işlem yaptığınızdan emin olun .
reka18

26

Sorun, venv altında pylint yolu yapılandırılarak çözülebilir: $ cat .vscode / settings.json

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

2
Windows için { "python.pythonPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe" "python.linting.pylintPath": "${workspaceFolder}\\.venv\\Scripts\\pylint.exe" } sadece tamlık içindir.
Roy2511

1
Soru bu editörü istemiyor.
Ivailo Bardarov

VSCode şimdi bu mesajı gösteriyor: Satırı The setting "python.pythonPath" defined in your settings.json is now deprecated. silersem python.pythonPathyine de çalışıyor gibi görünüyor.
Jesse Aldridge

23

__init__.pyHer iki dizinde de python'un dizinlerin modül olduğunu bildirmek için boş bir dosyanız var mı?

Klasör içinde (yani belki pylint's, ben bunu kullanmadıysanız) çalışmıyorsanız temel anahat:

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

Bu yüzden eğer PyLint kendi mutlak yolundan çalıştığı geçerli dizinde referans olmadan modülün farkındadır tercüman piton, erişim mümkün olacak nasıl functions_etc.pyolduğu topdir.functions_etcveya topdir.subdir.other_functionssağlanan topdirüzerindedir PYTHONPATH.

GÜNCELLEME: Sorun __init__.pydosya değilse, sadece modülünüzü kopyalamayı veya taşımayı deneyin c:\Python26\Lib\site-packages- bu ek paketler koymak için ortak bir yerdir ve kesinlikle pythonpath'ınızda olacaktır. Windows sembolik bağlantılarını veya eşdeğerini (bilmiyorum!) Nasıl yapacağınızı biliyorsanız, bunun yerine bunu yapabilirsiniz. Burada daha birçok seçenek var: http://docs.python.org/install/index.html , geliştirme kodunuzun kullanıcı düzeyi dizinine sys.path ekleme seçeneği de dahil olmak üzere, ancak pratikte genellikle sembolik olarak bağlantı veriyorum yerel geliştirme dizinimden site paketlerine - kopyalanması da aynı etkiye sahiptir.


1
Evet, __init__.pyher iki dizinde de var . Ben sorun PyLint çalışırken üst dir PYTHONPATH DEĞİL olduğunu düşünüyorum ve nasıl düzeltmek için emin değilim.
EMP

Symlink iyi bir fikirdir, ancak yalnızca Windows Vista'dan itibaren desteklenmektedir ve XP çalıştırıyorum. Sanırım zor bağlamayı deneyebilirim ...
EMP

yeniden hardlinking: Hayır, yapmasan iyi edersin. Onunla oynadım ve kesinlikle (bir şekilde) çalışırken, beklediğiniz gibi çalışmaz.
shylent

Sembolikler iyi bir fikir değildir. Bu sadece makinenizdeki sorunu düzeltir - başka biri projeyi kontrol ettiğinde, onlar için bozulur.
Jonathan Hartley

12

bu soru için genel cevap bu sayfada buldum lütfen açık değil, site hata

oluştur .pylintrcve ekle

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

5

WingIDE ile nasıl çalıştığını bilmiyorum, ancak Pyean'ı Geany ile kullanmak için harici komutumu şu şekilde ayarladım:

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

burada% f dosya adı ve% d yol. Birisi için yararlı olabilir :)


4

PYTHONPATHApp Engine yolumu eklemek için sistem değişkenini güncellemem gerekiyordu . Benim durumumda sadece dosyamı düzenlemek ~/.bashrcve aşağıdaki satırı eklemek zorunda kaldım :

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

Aslında, init-hookilk ayarlamayı denedim ama bu benim kod tabanı genelinde (neden emin değilim) sürekli sorunu çözmedi. Bir kez sistem yoluna ekledim (muhtemelen genel olarak iyi bir fikir) sorunlarım ortadan kalktı.


3

Az önce keşfettiğim bir çözüm, PyLint'i tek bir dosya yerine tüm paket için çalıştırmaktır. Her nasılsa, o zaman ithal modülü bulmayı başarıyor.


Harika görünüyor; Nasıl?
Cees Timmerman

1
@CeesTimmerman pylint ... dirÜst klasörden çalıştırın . Bunun için __init__.pyher alt klasörde .pydosyaların bulunması gerekir.
yugr

3

Deneyin

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

Python 3'te, elseyan tümcedeki parçanın sözdiziminin

from .. import one

İkinci düşüncede, bu muhtemelen sizin probleminizi çözmeyecektir. Soruyu yanlış anladım ve two.py'nin ana modül olarak çalıştırıldığını düşündüm, ancak durum böyle değil. Ve Python 2.6 (ithal etmeden şekilde farklılıkları dikkate absolute_importdan __future__ve Python 3.x kolu ithalat), yine Python 2.6 için bunu yapmak gerek olmaz, ben sanmıyorum.

Yine de, sonunda Python 3'e geçerseniz ve bir modülü hem paket modülü hem de paketin içinde bağımsız bir komut dosyası olarak kullanmayı planlıyorsanız, benzer bir şeyi saklamak iyi bir fikir olabilir.

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

akılda.

EDIT: Ve şimdi gerçek sorununuzu olası bir çözüm için. oneModülünüzü içeren dizinden PyLint'i çalıştırın (belki de komut satırı üzerinden) veya PyLint'i çalıştırırken aşağıdaki kodu bir yere koyun:

import os

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

Temel olarak, PYTHONPATH ile uğraşmaya alternatif olarak, geçerli çalışma dizininin one.pyiçe aktarma işlemini gerçekleştirdiğiniz dizinde olduğundan emin olun .

(Brian'ın cevabına bakarak, muhtemelen önceki kodu atayabilirsiniz init_hook, ancak bunu yapacaksanız, basitçe yaptığı eki yapabilirsiniz sys.path, bu da benim çözümümden biraz daha zariftir.)


2

Anahtar, sys.pathenv değişkenini düşünmeden proje dizininizi eklemektir .

VSCode kullanan biri için, projenizin temel bir dizini varsa, sizin için tek satırlık bir çözüm:

[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)'

Biraz açıklayayım:

  • re.search(r".+\/" + base_dir, os.getcwd()).group(): düzenleme dosyasına göre temel dizini bul

  • os.path.join(os.getcwd(), base_dir): komut satırı ortamını karşılamak cwdiçin eklesys.path


Bilginize, işte benim .pylintrc:

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


2

Ben de aynı sorunu vardı ve benim sanal olarak pylint yükleyip daha sonra aşağıdaki proje ile benim proje dizinine bir .pylintrc dosyası ekleyerek düzeltildi:

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

Bunun E0611 pylint hatalarından kurtulduğunu doğrulamak zorundayım, ancak E0401 hataları devam ediyor.
np8

1

Belki de elle PYTHONPATH içine ekleyerek?

sys.path.append(dirname)

Hmm, ama bu kodu nereye koyardın? Her dosyanın üstünde mi? Sanırım işe yarayacaktı, ancak PyLint'in işe yaraması oldukça kötü bir şey.
EMP

@Evgeny: Brian M. Hunt'ın son zamanlarda gönderdiği yanıtı görün.
JAB

Ve bunu her dosyanın üstüne eklemek bir sebepten ötürü işe yaramıyor - PyLint, taradığı modüllerde yapılan sys.path üzerinde yapılan değişiklikleri yok saymak için mükemmel bir içerik gibi görünüyor. Yine de nedenini araştırmak için
uğraşmadım

1

Aynı sorunu yaşadım ve bir cevap bulamadığım için bu benzer bir sorunu olan herkese yardımcı olabilir umarım.

Epylint ile flymake kullanıyorum. Temelde ne yaptım dired dizini bir python paket dizini olup olmadığını kontrol bir dired-mod-kanca eklemek oldu. Eğer öyleyse PYTHONPATH'a ekliyorum. Benim durumumda bir dizin "setup.py" adlı bir dosya içeriyorsa python paketi olarak görüyorum.

;;;;;;;;;;;;;;;;;
;; 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)

Bu yardımcı olur umarım.


1

Herhangi birinin pylint'i PyCharm'da harici bir araç olarak çalıştırmanın ve sanal ortamlarıyla çalışmasını sağlamanın bir yolu araması durumunda (neden bu soruya geldim), işte nasıl çözdüm:

  1. PyCharm> Tercihler> Araçlar> Harici Araçlar'da, pylint için öğe ekleyin veya düzenleyin.
  2. Aracı Düzenle iletişim kutusunun Araç Ayarları'nda, Programı python yorumlayıcı dizininden pylint kullanacak şekilde ayarlayın: $PyInterpreterDirectory$/pylint
  3. Parametreler alanında diğer parametrelerinizi aşağıdaki gibi ayarlayın: --rcfile=$ProjectFileDir$/pylintrc -r n $FileDir$
  4. Çalışma dizininizi $FileDir$

Şimdi pylint'i harici bir araç olarak kullanmak, ortak bir yapılandırma dosyası kullanarak seçtiğiniz dizinde pylint'i çalıştıracak ve projeniz için yapılandırılmış olan herhangi bir tercümanı kullanacaktır (muhtemelen sanalenv yorumcunuzdur).


1

Bu eski bir soru ama kabul edilmiş bir cevabı yok, bu yüzden şunu önereceğim: okumak için two.py ithalat ifadesini değiştirin:

from .. import one

Mevcut ortamımda (Python 3.6, pylint 2.3.1 kullanan VSCode) bu işaretli ifadeyi siler.


1

Güzel bir cevap buldum . Pylintrc'nizi düzenleyin ve aşağıdakileri master'a ekleyin

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

Python'u yüklediğinizde, yolu ayarlayabilirsiniz. Yol zaten tanımlanmışsa yapabileceğiniz şey VS Kodu'dur, Ctrl + Shift + P tuşlarına basın ve Python yazın: Yorumlayıcı'yı seçin ve Python'un güncellenmiş sürümünü seçin. Daha fazla bilgi için bu bağlantıyı izleyin, https://code.visualstudio.com/docs/python/environments



0

Linux'ta Cython kullanıyorsanız, module.cpython-XXm-X-linux-gnu.soproje hedef dizinimdeki dosyaları kaldırmayı çözdüm .


0

bu kodu .vscode / settings.json dosyasına eklemeniz yeterlidir

, "python.linting.pylintPath": "venv / bin / pylint"

Bu, pylint'in konumunu bildirecektir (python için bir hata denetleyicisi)


-1

Merhaba ben paketleri farklı dizinden içe aktarmayı başardım. Ben sadece aşağıdakileri yaptım: Not: VScode kullanıyorum

Python Paketi Oluşturma Adımları Python paketleriyle çalışmak gerçekten basittir. Tek yapmanız gereken:

Bir dizin oluşturun ve ona paketinizin adını verin. Sınıflarınızı içine koyun. Dizinde bir init .py dosyası oluşturun

Örneğin: Tüm özel sınıfları orada tuttuğunuz Framework adında bir klasörünüz var ve işiniz sadece Framework adında bir init .py dosyası oluşturmaktır .

Ve içe aktarırken bu şekilde içe aktarmanız gerekir --->

Çerçeve içe aktarma tabanından

Bu yüzden E0401 hatası kaybolur Framework, sadece init .py ve base oluşturduğunuz klasördür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.