LINUX.ORG.RU

Python не видит модули в одном из скриптов

 


0

2

ОС CentOS 7 в LXC-конейнере, через yum поставил python-dns
Есть два одинаковых скрипта

[root@dns /]# cat /root/test.py 
import sys; 
import pprint; 

pprint.pprint(sys.path)

import dns.resolver

[root@dns /]# cat /root/123/dns.py
import sys;
import pprint;

pprint.pprint(sys.path)

import dns.resolver




Первый скрипт отрабатывает, второй нет. Непонятно почему
[root@dns /]# python /root/test.py 
['/root',
 '/usr/lib/python2.7/site-packages/setuptools-18.1-py2.7.egg',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages']

[root@dns /]# python /root/123/dns.py
['/root/123',
 '/usr/lib/python2.7/site-packages/setuptools-18.1-py2.7.egg',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages']
['/root/123',
 '/usr/lib/python2.7/site-packages/setuptools-18.1-py2.7.egg',
 '/usr/lib64/python27.zip',
 '/usr/lib64/python2.7',
 '/usr/lib64/python2.7/plat-linux2',
 '/usr/lib64/python2.7/lib-tk',
 '/usr/lib64/python2.7/lib-old',
 '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages']
Traceback (most recent call last):
  File "/root/123/dns.py", line 6, in <module>
    import dns.resolver
  File "/root/123/dns.py", line 6, in <module>
    import dns.resolver
ImportError: No module named resolver

★★

/root/123/dns.py

dns.py

Может не надо именовать скрипт тем же именем, что у пакета, который он импортирует?

Psych218 ★★★★★
()

Подсказали, имя файла не может быть одинаковым с именем пакета.

f3ex ★★
() автор топика
Ответ на: комментарий от f3ex

Тебе неправильно подсказали. Делаю это правильно. Python при импорте ищет требуемый модуль по путям, которые хранятся в списке sys.path. При этом путь к каталогу, в котором находится исполняемый в данный момент модуль (в твоем случае это test.py и dns.py), автоматически добавляется _в начало_ sys.path, таким образом, поиск сначала производится в том же каталоге, где лежит исполняемый в данный момент модуль. Поэтому когда Python доходит до строки «import dns.resolver», он начинает искать модуль или пакет с именем «dns» в текущей директории. А там у тебя твой пример лежит, который так и называется. Начинается рекурсивный импорт, который обрывается только потому, что сущности с идентификатором «resolver» в твоем примере нет.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)

а зачем тут точка с запятой?

import sys;
Sahas ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.