Ошибка импорта: "Модуль с именем отсутствует" * * существует

Я получаю эту трассировку стека, когда я запускаю пирамиду 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

(Я изменил последнюю строку на абсолютный импорт. Не повезло.)

Вещи, которые я пробовал:

  1. Восстановление virtualenv

  2. Настройка PYTHONPATH

  3. Использование абсолютных путей в коде

  4. Ищем круговой импорт

Я открыт для дальнейших предложений о том, как отладить эту ошибку.


Поэтому ошибка, которую я сделал, состояла в том, чтобы смотреть только на дерево исходных текстов. Проблема была действительно в среде выполнения, в моем 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