Ошибка импорта: "Модуль с именем отсутствует" * * существует
Я получаю эту трассировку стека, когда я запускаю пирамиду Pserve:
% python $(which pserve) ../etc/development.ini
Traceback (most recent call last):
File "/home/hughdbrown/.local/bin/pserve", line 9, in <module>
load_entry_point('pyramid==1.5', 'console_scripts', 'pserve')()
File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 51, in main
return command.run()
File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 316, in run
global_conf=vars)
File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.egg/pyramid/scripts/pserve.py", line 340, in loadapp
return loadapp(app_spec, name=name, relative_to=relative_to, **kw)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 247, in loadapp
return loadobj(APP, uri, name=name, **kw)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 271, in loadobj
global_conf=global_conf)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 320, in _loadconfig
return loader.get_context(object_type, name, global_conf)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 454, in get_context
section)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 476, in _context_from_use
object_type, name=use, global_conf=global_conf)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 406, in get_context
global_conf=global_conf)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 337, in _loadfunc
return loader.get_context(object_type, name, global_conf)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/loadwsgi.py", line 681, in get_context
obj = lookup_object(self.spec)
File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.egg/paste/deploy/util.py", line 68, in lookup_object
module = __import__(parts)
File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/ponder-0.0.40-py2.7.egg/ponder/server/__init__.py", line 10, in <module>
from ponder.server.views import Endpoints, route
ImportError: No module named views
Это отлично работает из питона REPL:
% python
Python 2.7.5+ (default, Feb 27 2014, 19:37:08)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ponder.server.views import Endpoints, route
>>>
и из командной строки import:
% python -c "from ponder.server.views import Endpoints, route"
Сокращенный вывод tree
показывает, с чем я работаю:
% tree
├── __init__.py
├── ponder
│ ├── __init__.py
│ ├── server
│ │ ├── __init__.py
│ │ └── views
│ │ ├── environment_templates.py
│ │ ├── groups.py
│ │ ├── __init__.py
│ │ ├── instances.py
│ │ ├── tasks.py
│ │ └── users.py
Мой PYTHONPATH
установлен в корне этого дерева:
% echo $PYTHONPATH
/home/hughdbrown/workspace/ept/ponder/lib
Я запускаю это в virtualenv, который использует Python 2.7. У меня было это время от времени, но я не могу понять, где проблема. С одной стороны, __init__.py
похоже, подходит для некоторых импортов, которые происходят непосредственно перед:
from .database import get_db
from .config import parser
from .views import Endpoints, route
(Я изменил последнюю строку на абсолютный импорт. Не повезло.)
Вещи, которые я пробовал:
-
Восстановление virtualenv
-
Настройка PYTHONPATH
-
Использование абсолютных путей в коде
-
Ищем круговой импорт
Я открыт для дальнейших предложений о том, как отладить эту ошибку.
Поэтому ошибка, которую я сделал, состояла в том, чтобы смотреть только на дерево исходных текстов. Проблема была действительно в среде выполнения, в моем virtualenv. И когда я посмотрел туда, я обнаружил, что нужные файлы не были установлены. В корне проблема была в setup.py
.
Ответы
Ответ 1
Мой обычный трюк - просто напечатать sys.path
в реальном контексте, где возникает проблема импорта. В вашем случае может показаться, что место для печати находится в /home/hughdbrown/.local/bin/pserve
. Затем проверьте каталоги и файлы в местах, указанных в пути.
Вы делаете это, сначала имея:
import sys
и в Python 2 с печатным выражением:
print sys.path
или в Python 3 с функцией печати:
print(sys.path)
Ответ 2
Я установил PYTHONPATH
в '.'
и решил это для меня.
export PYTHONPATH='.'
Для однострочного интерфейса вы можете так же легко:
PYTHONPATH='.' your_python_script
Ожидается, что эти команды будут запущены в терминале
Ответ 3
У меня была та же проблема, и я решил ее, добавив следующий код в начало файла python:
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
Количество повторений os.path.dirname
зависит от того, где находится файл вашей иерархии проектов. Например, в моем случае корень проекта состоит из трех уровней.
Ответ 4
Я встретил ту же проблему, и я попробовал pdb.set_trace() перед строкой ошибки.
Моя проблема - дубликат имени пакета с именем модуля, например:
test
├── __init__.py
├── a
│ ├── __init__.py
│ └── test.py
└── b
└── __init__.py
и в файле a/__init__.py
использование from test.b import xxx
приведет к ImportError: No module named b
.
Ответ 5
Это несколько способов запуска python script:
- выполняется двойным щелчком по файлу .py(он открывает командную строку python)
- запустите файл .py из командной строки (cmd) (перетаскивание/перетаскивание)
ваш файл на нем, например)
- запустите файл file.py в вашей среде IDE (например, pyscripter или Pycharm).
Каждый из этих способов может запускать другую версию python (¤)
Проверьте, какая версия python запускается с помощью cmd:
Введите cmd:
python --version
Проверьте, какая версия python запускается при нажатии на .py:
вариант 1:
создайте test.py, содержащий это:
import sys print (sys.version)
input("exit")
Вариант 2:
введите cmd:
assoc .py
ftype Python.File
Проверьте путь и если модуль (например: win32clipboard) распознается в cmd:
создайте test.py, содержащий это:
python
import sys
sys.executable
sys.path
import win32clipboard
win32clipboard.__file__
Проверьте путь, и если модуль распознан в .py
создайте test.py, содержащий это:
import sys
print(sys.executable)
print(sys.path)
import win32clipboard
print(win32clipboard.__file__)
Если версия в cmd в порядке, но не в .py, потому что программа по умолчанию, связанная с .py, не является правильной. Измените версию python для .py
Чтобы изменить версию python, связанную с cmd:
Control Panel\All Control Panel Items\System\Advanced system setting\Environnement variable
В переменной SYSTEM задайте переменную path
для вашей версии python (путь разделяется на ;
: cmd использует ПЕРВЫЙ путь, например: C:\path\to\Python27; C:\path\to\Python35 → cmd будет используйте python27)
Чтобы изменить версию python, связанную с расширением .py:
Запустите cmd как admin:
Write: ftype Python.File="C:\Python35\python.exe" "%1" %*
Он установит последнюю версию python (например, python3.6). Если ваша последняя версия - 3,6, но вы хотите, чтобы 3.5 просто добавили некоторые ххх в вашу папку (xxxpython36), поэтому она будет принимать последнюю распознанную версию, которая является python3.5 (после того, как cmd удалит xxx).
Другое:
"Ошибка модуляции" также может возникнуть из синтаксической ошибки btw python et 3 (например, отсутствующая скобка для функции печати...)
¤ Таким образом, каждый из них имеет собственную версию протокола
Ответ 6
У меня тоже была эта проблема, я только что забыл ввести workon myproject в терминал перед выполнением моей программы.
Ответ 7
PYTHONPATH
установлен неправильно. Экспортируйте его, используя export PYTHONPATH=$PYTHONPATH: /path/to/your/modules
.
Ответ 8
У меня была такая же проблема. Я решил это, выполнив команду в другой версии python. Я попробовал python3 filename.py
. Раньше я использовал Python 2.7.
Другая возможность заключается в том, что файл, из которого что-то импортируется, может содержать спецификацию (отметка байтового байта). Его можно решить, открыв файл в каком-нибудь редакторе, который поддерживает несколько кодировок, таких как VSCode (Notepad ++) и сохранение в другом кодировании statndard, таком как ANSI, UTF-8 (без спецификации).
Ответ 9
В случае, если это представляет интерес для всех, у меня была такая же проблема, когда я запускал Python в Cygwin, в моем случае было неудобно, что pandas не был установлен, даже если это было. Проблема состояла в том, что у меня было 2 инсталляции python - один в Windows и еще один в cygwin (с использованием установщика cygwin), и хотя оба варианта были одинаковыми версиями Python, установка Cygwin была смущена тем, где был установлен pandas. Когда я удалил cygwin Python и указал Cygwin на установку Windows, все было в порядке
Ответ 10
Если у вас есть скрипт с тем же именем, что и у вашего модуля в другом каталоге, он будет использовать его вместо этого. Например:
module.py
module
|
|--module
| |
| |--__init__.py
| |--module.py
Это позволит использовать первый module.py, а не второй.
Ответ 11
Я понял это, когда неправильно набрал текст. я имел
__init.py__
вместо
__init__.py