If you want to walk up from the current module/file that was handed to pylint looking for the root of the module, this will do it.
[MASTER]
init-hook=sys.path += [os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i])) for i, _ in enumerate(sys.argv[-1].split(os.sep)) if os.path.isdir(os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i], '.git')))][::-1]
If you have a python module ~/code/mymodule/, with a top-level directory layout like this
~/code/mymodule/
├── .pylintrc
├── mymodule/
│ └── src.py
└── tests/
└── test_src.py
Then this will add ~/code/mymodule/ to your python path and allow for pylint to run in your IDE, even if you’re importing mymodule.src in tests/test_src.py.
You could swap out a check for a .pylintrc instead but a git directory is usually what you want when it comes to the root of a python module.
Before you ask
The answers using import sys, os; sys.path.append(...) are missing something that justifies the format of my answer. I don’t normally write code that way, but in this case you’re stuck dealing with the limitations of the pylintrc config parser and evaluator. It literally runs exec in the context of the init_hook callback so any attempt to import pathlib, use multi-line statements, store something into variables, etc., won’t work.
A less disgusting form of my code might look like this:
import os
import sys
def look_for_git_dirs(filename):
has_git_dir = []
filename_parts = filename.split(os.sep)
for i, _ in enumerate(filename_parts):
filename_part = os.path.abspath(os.path.join(os.path.sep, *filename_parts[:i]))
if os.path.isdir(os.path.join(filename_part, '.git')):
has_git_dir.append(filename_part)
return has_git_dir[::-1]
# don't use .append() in case there's < 1 or > 1 matches found
sys.path += look_for_git_dirs(sys.argv[-1])
I wish I could have used pathlib.Path(filename).parents it would have made things much easier.
IgorDV
Модуль импортируется, доступ к содержимому есть.
И все равно подчеркивает import — Unable to import ‘util_date’pylint(import-error)
Ну это сугубо ограничения IDE.
Вы же понимаете, что для того, чтобы правильно импортировать модуль util_date надо выполнить код?
Вот эта ваша строка
sys.path.append(os.path.join(sys.path, ‘..\util’))
должна быть выполнена перед импортом. Это не магия, не специальный синтаксис, это обычный вызов функции в питоне.
А теперь подумайте, а откуда IDE должна знать, что пути к библиотеке меняются по ходу выполнения программы? Откуда она знает, что вы вызываете функцию, которая добавляет путь к каталогу вашего модуля? Вы подразумеваете, что IDE выполняет код, который читает. Это было бы вообще говоря довольно опасное поведение, давайте представим, что мы пишем программу, котоая удаляет все файлы из домашней директории. И вот мы написали программу, а ИДЕ взяла и без спроса её выполнила.
Ну и вообще, кто мешает написать вот такой код
if DEVELOP: sys.path.append(os.path.join(sys.path, 'develop', 'util')) elif PRODUCTION: sys.path.append(os.path.join(sys.path, 'prod', 'util')) elif TEST: .....
И как ваша ИДЕ должна определить, какой именно модуль вы собрались поключать?
1. Unable to import (pylint)
- Scenario: You have a module installed, however the linter in the IDE is complaining about; not being able to import the module, hence error messages such as the following are displayed as linter errors:
.. unable to import 'xxx' ..
- Cause: The Python extension is most likely using the wrong version of Pylint.
Solution 1: (configure workspace settings to point to fully qualified python executable):
- Open the workspace settings (settings.json)
- Identify the fully qualified path to the python executable (this could even be a virtual environment)
- Ensure Pylint is installed for the above python environment
- Configure the setting “pythonPath” to point to (previously identified) the fully qualified python executable.
"python.pythonPath": "/users/xxx/bin/python"
Solution 2: (open VS Code from an activated virtual environment):
- Open the terminal window
- Activate the relevant python virtual environment
- Ensure Pylint is installed within this virtual environment
pip install pylint - Close all instances of VS Code
- Launch VS Code from within this terminal window
(this will ensure the VS Code process will inherit all of the Virtual Env environment settings)
2. Linting with xxx failed. …
Listing could fail due to a number of reasons. Please check each of the following.
Cause: The path to the python executable is incorrect
Solution: Configure the path to the python executable in the settings.json
Cause: The linter has not been installed in the Python environment being used
Solution: Identify the Python environment (executable) configured in settings.json. Next install the linter(s) against this Python environment (use the corresponding Pip).
Cause: The Path to the linter is incorrect
Solution: If you have provided a custom path to the linter in settings.json, then ensure this file path exist.
For further information on configuring Linters can be found here.
3. Ignore certain messages
It is possible you would like to ignore certain linter messages. This could be done easily.
Generally most linters support configuration files, hence all you need to do is create the relevant configuration file and ignore the appropriate error message.
If on the other hand the linters support the ability to ignore certain messages via command line args, this can be done as well.
Solution: Add relevant command line args to ignore certain messages
Here we’ll assume you use a TAB character as indentation of python code instead of 4 or 2 spaces.
Pylint would generally display a warning for this with the error code W0312.
In order to disable this particular message all one needs to do is as follows in the settings.json file:
"python.linting.pylintArgs": [
"--disable=W0312"
],
Note: You could apply the above configuration settings in your user settings file, so that it applies to all workspaces.
This saves you from having to define these settings for every single workspace (every time).
For further information on configuring Linters can be found here.
Вопрос:
Я запускаю PyLint из внутренней среды Wing IDE в Windows. У меня есть подкаталог (пакет) в моем проекте, и внутри пакета я импортирую модуль с верхнего уровня, т.е.
__init__.py
myapp.py
one.py
subdir
__init__.py
two.py
Внутри two.py У меня есть import one, и это отлично работает во время выполнения, потому что каталог верхнего уровня (из которого выполняется myapp.py) находится в пути Python. Однако, когда я запускаю PyLint на two.py, это дает мне ошибку:
F0401: Unable to import 'one'
Как это исправить?
Ответ №1
Есть два варианта, которые мне известны.
Во-первых, измените переменную среды PYTHONPATH, чтобы она включала каталог над вашим модулем.
Либо отредактируйте ~/.pylintrc, чтобы он включал каталог над вашим модулем, например:
[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'
(или в другой версии pylint, ловушка инициализации требует, чтобы вы изменили [General] на [MASTER])
Оба эти варианта должны работать.
Надеюсь, это поможет.
Ответ №2
1) sys.path – это список.
2) Проблема в том, что sys.path – это не ваш virtualenv.path, и вы хотите использовать pylint в вашем virtualenv
3) Так, как и сказано, используйте init-hook (обратите внимание в ‘и “синтаксический анализ pylint строго)
[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
Ответ №3
Решение об изменении пути в 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().
Ответ №4
У вас есть пустой файл __init__.py в обоих каталогах, чтобы позволить python знать, что dirs являются модулями?
Основной контур, когда вы не работаете из папки (т.е., может быть, из pylint, хотя я этого не использовал):
topdir
__init__.py
functions_etc.py
subdir
__init__.py
other_functions.py
Так интерпретатор python знает модуль без ссылки на текущий каталог, поэтому, если pylint работает от своего абсолютного пути, он сможет получить доступ к functions_etc.py как topdir.functions_etc или topdir.subdir.other_functions, при условии, что topdir находится на PYTHONPATH.
UPDATE: если проблема не в файле __init__.py, возможно, просто попробуйте скопировать или переместить ваш модуль на c:Python26Libsite-packages – это обычное место для размещения дополнительных пакетов и, безусловно, будет на вашем пути python. Если вы знаете, как делать символические ссылки Windows или эквивалентные (я этого не делаю!), Вы можете сделать это вместо этого. Есть еще много опций здесь: http://docs.python.org/install/index.html, включая возможность добавления sys.path с каталогом уровня вашего кода разработки, но на практике я обычно просто символически связываю свой локальный каталог разработки с сайтами-пакетами – копирование его имеет тот же эффект.
Ответ №5
Проблема может быть решена путем настройки пути pylint под venv:
$ cat.vscode/settings.json
{
"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"
}
Ответ №6
Я не знаю, как это работает с WingIDE, но для использования PyLint с Geany я установил внешнюю команду:
PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f"
где% f – имя файла, а% d – путь. Может быть полезно кому-то:)
Ответ №7
Мне пришлось обновить переменную system PYTHONPATH, чтобы добавить мой путь к App Engine. В моем случае мне просто пришлось отредактировать файл ~/.bashrc и добавить следующую строку:
export PYTHONPATH=$PYTHONPATH:/path/to/google_appengine_folder
На самом деле, я сначала попытался установить init-hook, но это не помогло решить проблему последовательно по моей базе кода (не знаю почему). Как только я добавил его на системный путь (вероятно, хорошая идея в целом), мои проблемы ушли.
Ответ №8
Один обходной путь, который я только что открыл, – это просто запустить PyLint для всего пакета, а не только одного файла. Так или иначе, ему удастся найти импортированный модуль.
Ответ №9
Попробуйте
if __name__ == '__main__':
from [whatever the name of your package is] import one
else:
import one
Обратите внимание, что в Python 3 синтаксис для части в предложении else будет
from .. import one
Забастовкa >
С другой стороны, это, вероятно, не решит вашу конкретную проблему. Я не понял этот вопрос и подумал, что two.py запускается в качестве основного модуля, но это не так. И учитывая различия в способе Python 2.6 (без импорта absolute_import from __future__) и импорта ручек Python 3.x, в любом случае вам не нужно будет делать это для Python 2.6, я не думаю.
Тем не менее, если вы в конечном итоге переключитесь на Python 3 и планируете использовать модуль как пакетный модуль и как автономный script внутри пакета, может быть хорошей идеей сохранить
что-то вроде
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
в виду.
EDIT: И теперь для возможного решения вашей реальной проблемы. Либо запустите PyLint из каталога, содержащего ваш модуль one (возможно, с помощью командной строки), либо поместите следующий код где-нибудь при запуске PyLint:
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, которое он делает, что немного более элегантно чем мое решение.)
Ответ №10
Ключ состоит в том, чтобы добавить каталог проекта в sys.path без учета переменной env.
Для тех, кто использует 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
Ответ №11
У меня была такая же проблема и я исправил ее, установив pylint в свой virtualenv, а затем добавив файл .pylintrc в каталог проекта со следующим в файле:
[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'
Ответ №12
Может быть, вручную добавив каталог в PYTHONPATH?
sys.path.append(dirname)
Ответ №13
У меня была такая же проблема, и поскольку я не мог найти ответ, я надеюсь, что это может помочь любому, у кого есть аналогичная проблема.
Я использую flymake с эпилином. В основном то, что я сделал, это добавить привязку в режиме ожидания, которая проверяет, является ли устаревшая директория каталогом пакетов python. Если я добавлю его в PYTHONPATH. В моем случае я считаю, что каталог является пакетом python, если он содержит файл с именем “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)
Надеюсь, что это поможет.
Ответ №14
Если кто-то ищет способ запустить pylint в качестве внешнего инструмента в PyCharm и работать с виртуальными средами (почему я пришел к этому вопросу), вот как я его решил:
- В PyCharm > Настройки > Инструменты > Внешние инструменты, добавьте или отредактируйте элемент для pylint.
- В диалоговом окне “Инструменты” диалогового окна “Редактировать инструмент” установите “Программа” на использование pylint из каталога интерпретатора python:
$PyInterpreterDirectory$/pylint - Задайте другие параметры в поле “Параметры”, например:
--rcfile=$ProjectFileDir$/pylintrc -r n $FileDir$ - Установите рабочий каталог
$FileDir$
Теперь, используя pylint в качестве внешнего инструмента, запустите pylint в любом каталоге, который вы выбрали, используя общий файл конфигурации и используя любой интерпретатор, настроенный для вашего проекта (который предположительно является вашим интерпретатором virtualenv).
Ответ №15
Я нашел хороший ответ от https://sam.hooke.me/note/2019/01/call-python-script-from-pylint-init-hook/
отредактируйте ваш pylintrc и добавьте следующее в master 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'))"
Ответ №16
если вы используете vscode, убедитесь, что каталог вашего пакета находится вне каталога _pychache__.
Ответ №17
Это старый вопрос, но нет принятого ответа, поэтому я предлагаю: измените оператор импорта в two.py, чтобы он читался следующим образом:
from .. import one
В моей текущей среде (Python 3.6, VSCode использует pylint 2.3.1) это очищает помеченный оператор.
Ответ №18
Если вы используете Cython в Linux, я решил удалить файлы module.cpython-XXm-X-linux-gnu.so из целевой директории моего проекта.
Ответ №19
Здравствуйте, я смог импортировать пакеты из другого каталога. Я просто сделал следующее:
Примечание. Я использую VScode
Шаги для создания пакета Python
Работать с пакетами Python действительно просто. Все, что вам нужно сделать, это:
Создайте каталог и дайте ему имя вашего пакета.
Поместите свои классы в это.
Создайте файл init.py в каталоге
.Например: у вас есть папка с именем Framework, в которой вы храните все пользовательские классы, и ваша задача – просто создать файл init.py внутри папки с именем Framework.
И при импорте вам нужно импортировать в этот fashion—>
из базы импорта Framework
так что ошибка E0401 исчезает
Framework – это папка, в которой вы только что создали init.py и
base – ваш пользовательский модуль, в который вы должны импортировать и работать над
Надеюсь, это поможет!!!!
Environment data
- VS Code version: 1.20.0
- Extension version (available under the Extensions sidebar): 2018.2.1
- OS and version: macOS Sierra version 10.12.6
- Python version (& distribution if applicable, e.g. Anaconda): Anaconda custom (64 bit) Python 3.6.4
- Type of virtual environment used (N/A | venv | virtualenv | conda | …): conda
- Relevant/affected Python packages and their versions:



Actual behavior
This program works fine from the command line. I wrote this using the Python extension approx. 6 months ago on another mac. I recently picked up this program again and it shows me the import errors as shown in the attached screenshot. I know that it is pylint related. I am also attaching my user settings and workspace settings screenshots
Expected behavior
It should not show errors for import
Steps to reproduce:
See the screenshorts
Logs
Output for Python in the Output panel (View→Output, change the drop-down the upper-right of the Output panel to Python)
6,0,error,E0401:Unable to import ‘vglabs_common’
7,0,error,E0401:Unable to import ‘vglabs_anis’
8,0,error,E0401:Unable to import ‘vglabs_brz’
10,0,error,E0401:Unable to import ‘vglabs_inf’
11,0,error,E0401:Unable to import ‘vglabs_mrp’
12,0,error,E0401:Unable to import ‘vglabs_nmr’
13,0,error,E0401:Unable to import ‘vglabs_op’
14,0,error,E0401:Unable to import ‘vglabs_re’
15,0,error,E0401:Unable to import ‘vglabs_ssk’
16,0,error,E0401:Unable to import ‘vglabs_txc’
17,0,error,E0401:Unable to import ‘vglabs_xrd’
##########Linting Output — pylint##########
No config file found, using default configuration
************* Module vglabs_uploader
6,0,error,E0401:Unable to import ‘vglabs_common’
7,0,error,E0401:Unable to import ‘vglabs_anis’
8,0,error,E0401:Unable to import ‘vglabs_brz’
10,0,error,E0401:Unable to import ‘vglabs_inf’
11,0,error,E0401:Unable to import ‘vglabs_mrp’
12,0,error,E0401:Unable to import ‘vglabs_nmr’
13,0,error,E0401:Unable to import ‘vglabs_op’
14,0,error,E0401:Unable to import ‘vglabs_re’
15,0,error,E0401:Unable to import ‘vglabs_ssk’
16,0,error,E0401:Unable to import ‘vglabs_txc’
17,0,error,E0401:Unable to import ‘vglabs_xrd’
59,0,refactor,R0912:Too many branches (15/12)
107,0,refactor,R0912:Too many branches (15/12)
5,0,warning,W0611:Unused import psycopg2
XXX
Output from `Console` under the `Developer Tools` panel (toggle Developer Tools on under `Help`)
XXX
How do I resolve the «Unable to import module» error that I receive when I run Lambda code in Python?
Last updated: 2022-04-12
I receive an «Unable to import module» error when I try to run my AWS Lambda code in Python. How do I resolve the error?
Short description
You typically receive this error when your Lambda environment can’t find the specified library in the Python code. This is because Lambda isn’t prepackaged with all Python libraries.
To resolve this error, create a deployment package or Lambda layer that includes the libraries that you want to use in your Python code for Lambda.
Important: Make sure that you put the library that you import for Python inside the /python folder.
Resolution
Note: The following steps show you how to create a Lambda layer rather than a deployment package. This is because you can reuse the Lambda layer across multiple Lambda functions. Each Lambda runtime adds specific /opt directory folders to the PATH variable. If the layer uses the same folder structure, then your Lambda function’s code can access the layer content without specifying the path.
It’s a best practice to create a Lambda layer on the same operating system that your Lambda runtime is based on. For example, Python 3.8 is based on an Amazon Linux 2 Amazon Machine Image (AMI). However, Python 3.7 and Python 3.6 are based on the Amazon Linux AMI.
To create a Lambda layer for a Python 3.8 library, do the following:
1. In the AWS Cloud9 console, create an Amazon Elastic Compute Cloud (Amazon EC2) instance with Amazon Linux 2 AMI. For instructions, see Creating an EC2 environment in the AWS Cloud9 User Guide.
2. Create an AWS Identity and Access Management (IAM) policy that grants permissions to call the PublishLayerVersion API operation.
Example IAM policy statement that grants permissions to call the PublishLayerVersion API operation
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "lambda:PublishLayerVersion",
"Resource": "*"
}
]
}
$ sudo amazon-linux-extras install python3.8
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python3.8 get-pip.py --user
5. Create a python folder by running the following command:
6. Install the Pandas library files into the python folder by running the following command:
Important: Replace Pandas with the name of the Python library that you want to import.
$ python3.8 -m pip install pandas -t python/
7. Zip the contents of the python folder into a layer.zip file by running the following command:
$ zip -r layer.zip python
8. Publish the Lambda layer by running the following command:
Important: Replace us-east-1 with the AWS Region that your Lambda function is in.
$ aws lambda publish-layer-version --layer-name pandas-layer --zip-file fileb://layer.zip --compatible-runtimes python3.8 --region us-east-1
Did this article help?
Do you need billing or technical support?
AWS support for Internet Explorer ends on 07/31/2022. Supported browsers are Chrome, Firefox, Edge, and Safari.
Learn more »
Пытаться
if __name__ == '__main__':
from [whatever the name of your package is] import one
else:
import one
Обратите внимание, что в Python 3 синтаксис для части в else пункт будет
from .. import one
Если подумать, это, вероятно, не решит вашу конкретную проблему. Я неправильно понял вопрос и подумал, что two.py запускается как основной модуль, но это не так. И учитывая различия в способах Python 2.6 (без импорта absolute_import от __future__) и Python 3.x обрабатывают импорт, вам в любом случае не нужно делать это для Python 2.6, я не думаю.
Тем не менее, если вы в конечном итоге переключитесь на Python 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
в виду.
РЕДАКТИРОВАТЬ: А теперь о возможном решении вашей реальной проблемы. Либо запустите PyLint из каталога, содержащего ваш one модуль (возможно, через командную строку) или поместите где-нибудь следующий код при запуске PyLint:
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 что он делает, что немного более элегантно, чем мое решение.)
Я запускаю PyLint изнутри Wing IDE на Windows. У меня есть подкаталог (пакет) в моем проекте, и внутри пакета я импортирую модуль с верхнего уровня, т.е.
__init__.py
myapp.py
one.py
subdir
__init__.py
two.py
Внутри у two.pyменя есть, import oneи это прекрасно работает во время выполнения, потому что каталог верхнего уровня (из которого myapp.pyзапускается) находится в пути Python. Однако, когда я запускаю PyLint на two.py, он выдает ошибку:
F0401: Unable to import 'one'
Как это исправить?
Ответы:
Есть два варианта, которые я знаю.
Во-первых, измените PYTHONPATHпеременную среды, чтобы она включала каталог над вашим модулем.
Или отредактируйте, ~/.pylintrcчтобы включить каталог над вашим модулем, например так:
[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'
(Или в другой версии pylint, init-hook требует от вас изменить [General] на [MASTER])
Оба эти варианта должны работать.
Надеюсь, это поможет.
Решение по изменению пути 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) sys.path — это список.
2) Иногда проблема в том, что sys.path не является вашим virtualenv.path, и вы хотите использовать pylint в вашем virtualenv.
3) Как и сказано, используйте init-hook (обратите внимание на ‘и «синтаксический анализ pylint)
[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
Проблема может быть решена путем настройки пути pylint под venv: $ cat .vscode / settings.json
{
"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"
}
У вас есть пустой __init__.pyфайл в обоих каталогах, чтобы python знал, что каталоги являются модулями?
Основная схема, когда вы не запускаете из папки (то есть, возможно, из Pylint, хотя я не использовал это):
topdir
__init__.py
functions_etc.py
subdir
__init__.py
other_functions.py
Это то, как интерпретатор Python узнает о модуле без ссылки на текущий каталог, поэтому, если Pylint работает по своему собственному абсолютному пути, он сможет получить доступ functions_etc.pyкак topdir.functions_etcили topdir.subdir.other_functions, если он topdirнаходится в PYTHONPATH.
ОБНОВЛЕНИЕ: Если проблема не в __init__.pyфайле, возможно просто попробуйте скопировать или переместить ваш модуль в c:Python26Libsite-packages— это обычное место для размещения дополнительных пакетов, и он обязательно будет в вашем pythonpath. Если вы знаете, как создавать символические ссылки Windows или аналогичные (я не знаю!), Вы можете сделать это вместо этого. Здесь есть еще много вариантов : http://docs.python.org/install/index.html , включая возможность добавления sys.path к каталогу пользовательского уровня вашего кода разработки, но на практике я обычно просто символически связываю мой локальный каталог разработки для пакетов сайта — копирование его имеет тот же эффект.
общий ответ на этот вопрос, который я нашел на этой странице, пожалуйста, не открыт, сайт ошибся
создать .pylintrcи добавить
[MASTER]
init-hook="from pylint.config import find_pylintrc;
import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
Я не знаю, как это работает с WingIDE, но для использования PyLint с Geany я установил свою внешнюю команду на:
PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f"
где% f — имя файла, а% d — путь. Может быть кому-то пригодится 🙂
Мне пришлось обновить системную PYTHONPATHпеременную, чтобы добавить мой путь к App Engine. В моем случае мне просто нужно было отредактировать мой ~/.bashrcфайл и добавить следующую строку:
export PYTHONPATH=$PYTHONPATH:/path/to/google_appengine_folder
На самом деле, я попытался установить init-hookпервый, но это не помогло решить проблему во всей моей кодовой базе (не знаю почему). Как только я добавил его в системный путь (вероятно, хорошая идея в целом), мои проблемы исчезли.
Один из обходных путей, который я только что обнаружил, — это просто запустить PyLint для всего пакета, а не для одного файла. Каким-то образом удается найти импортированный модуль.
Пытаться
if __name__ == '__main__':
from [whatever the name of your package is] import one
else:
import one
Обратите внимание, что в Python 3 синтаксис для части в else предложении будет
from .. import one
Если подумать, это, вероятно, не решит вашу конкретную проблему. Я неправильно понял вопрос и подумал, что two.py запускается как основной модуль, но это не так. И учитывая различия в способе Python 2.6 (без импорта absolute_importиз__future__ ) и Python 3.x, в любом случае вам не понадобится делать это для Python 2.6, я не думаю.
Тем не менее, если вы в конечном итоге переключитесь на Python 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
в уме.
РЕДАКТИРОВАТЬ: И теперь для возможного решения вашей актуальной проблемы. Либо запустите PyLint из каталога, содержащего ваш oneмодуль (возможно, из командной строки), либо поместите следующий код где-нибудь при запуске PyLint:
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то, что он делает, что несколько элегантнее, чем мое решение.)
Ключ должен добавить каталог вашего проекта в sys.path без учета переменной env.
Для тех, кто использует 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соответствовать среде командной строки
К вашему сведению, вот мой .pylintrc:
https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f
У меня была та же проблема, и я исправил ее, установив pylint в моем virtualenv, а затем добавив файл .pylintrc в каталог моего проекта, добавив в него следующее:
[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'
Может быть, вручную добавив dir в PYTHONPATH?
sys.path.append(dirname)
У меня была такая же проблема, и так как я не мог найти ответ, я надеюсь, что это может помочь любому с подобной проблемой.
Я использую мухи с эпилинтом. По сути, я добавил хук dired-mode, который проверял, является ли каталог dired каталогом пакета python. Если это так, я добавляю его в PYTHONPATH. В моем случае я считаю каталог пакетом Python, если он содержит файл с именем «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)
Надеюсь это поможет.
Если кто-то ищет способ запустить Pylint как внешний инструмент в PyCharm и заставить его работать со своими виртуальными средами (почему я пришел к этому вопросу), вот как я решил это:
- В PyCharm> «Настройки»> «Инструменты»> «Внешние инструменты» добавьте или измените элемент для столбца.
- В настройках инструмента диалогового окна «Редактировать инструмент» задайте для программы использование pylint из каталога интерпретатора python:
$PyInterpreterDirectory$/pylint - Установите другие параметры в поле «Параметры», например:
--rcfile=$ProjectFileDir$/pylintrc -r n $FileDir$ - Установите ваш рабочий каталог на
$FileDir$
Теперь использование pylint в качестве внешнего инструмента будет запускать pylint в любом каталоге, который вы выбрали, используя общий файл конфигурации, и использовать любой интерпретатор, настроенный для вашего проекта (который, вероятно, является вашим интерпретатором virtualenv).
Это старый вопрос, но нет принятого ответа, поэтому я предлагаю: измените оператор импорта в two.py, чтобы он читался так:
from .. import one
В моей текущей среде (Python 3.6, VSCode с использованием pylint 2.3.1) это очищает помеченный оператор.
Я нашел хороший ответ . Отредактируйте ваш pylintrc и добавьте следующее в master
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'))"
Когда вы устанавливаете Python, вы можете настроить путь. Если путь уже определен, то, что вы можете сделать, находится в VS Code, нажмите Ctrl + Shift + P и введите Python: выберите Interpreter и выберите обновленную версию Python. Перейдите по этой ссылке для получения дополнительной информации, https://code.visualstudio.com/docs/python/environments
если вы используете vscode, убедитесь, что каталог вашего пакета находится вне каталога _pychache__.
Если вы используете Cython в Linux, я решил удалить module.cpython-XXm-X-linux-gnu.soфайлы из целевой директории моего проекта.
просто добавьте этот код в файл .vscode / settings.json
, «python.linting.pylintPath»: «venv / bin / pylint»
Это сообщит местоположение pylint (который является средством проверки ошибок для python)
Здравствуйте, я смог импортировать пакеты из другого каталога. Я просто сделал следующее: Примечание: я использую VScode
Шаги для создания пакета Python Работать с пакетами Python действительно просто. Все, что вам нужно сделать, это:
Создайте каталог и дайте ему имя вашего пакета. Поместите свои классы в это. Создайте файл init .py в каталоге
Например: у вас есть папка с именем Framework, в которой вы храните все пользовательские классы, и ваша задача — просто создать файл init .py внутри папки с именем Framework.
И при импорте нужно импортировать таким образом —>
из базы импорта Framework
ошибка E0401 исчезает. Framework — это папка, в которой вы только что создали init .py, а base — ваш пользовательский модуль, в который вы должны импортировать и работать над ним. Надеюсь, это поможет !!!!
Igor
Новичок
Пользователь
-
#1
Модуль импортируется, доступ к содержимому есть.
И все равно подчеркивает import — Unable to import ‘util_date’pylint(import-error)
Python:
import sys
import os
sys.path.append(os.path.join(sys.path[0], '..\util'))
from datetime import date
import util_date
ОС win10
python 3.8
ide VScode
Student
throw exception
Команда форума
Администратор
-
#2
Может быть так:
Python:
from util import util_date