2015-12-21 4 views
2

У меня есть папка с двумя файлами: test.py и csv.py. В test.py У меня естьPython 3 абсолютный импорт не работает

import csv 

Это импортирует мой csv.py файл вместо того, чтобы импортировать встроенный модуль CSV.

Почему? Я думал, что абсолютный импорт был дефолтом в Python 3?

Как заставить Python загружать встроенный модуль csv?

from __future__ import absolute_import 

не помогает. Также нет

csv = __import__('csv', level=0) 

, который, согласно документам, должен «выполнять только абсолютный импорт».

Переименование csv.py не является приемлемым решением. Кроме того, я бы предпочел не использовать синтаксис «из модуля импорта что-то» (а не то, что он помогает в этом случае).

(Использование Python 3.4.0 на Linux Mint 17.1)

+0

'absolute_import' уже включен по умолчанию с 3.0 - см. Таблицу внизу [' __future__' docs] (https://docs.python.org/3.5/library/__future__.html). – senshin

+0

Я тоже так думал. Так что любая идея, почему она, кажется, не работает для меня? – uhuygiuhlk

+3

«Как заставить Python загружать встроенный модуль csv?» Наиболее предпочтительно, чтобы не теневые встроенные имена. – DeepSpace

ответ

4

у вас есть модуль верхнего уровня csv, который живет на . пути, так что он находится перед встроенным модулем. Это как абсолютный импорт работы.

Переместите модули в пакет, если вы ожидали, что csv будет «локальным». Переместите модули в каталог с именем своего пакета и добавьте файл __init__.py (он может быть пустым). Затем ваш модуль csv именуется как yourpackage.csv и не будет считаться модулем верхнего уровня.

+0

Я добавил пустой файл \ _ \ _ init__.py. Импорт CSV не работает. И импортирует файл foldername.csv, где имя_папки - это имя папки, содержащей эти файлы. Откуда берется «ваш пакет»? – uhuygiuhlk

+0

@uhuygiuhlk: вы создали новый каталог? Каталог с файлом '__init __. Py' в нем формирует пакет, но каталог верхнего уровня находится на вашем пути, а не модули внутри пакета. Если у вас есть сценарий для запуска этого кода, сохраните это * вне * вашего каталога и импортируйте из пакета. Так, например, организованы пакеты ['urllib'] (https://docs.python.org/3/library/urllib.html); вы импортируете 'urllib.request', например, а не' request'. –

+0

@uhuygiuhlk: важна часть скрипта, каталог, в котором живет скрипт, автоматически добавляется к вашему пути, но вы * не хотите, чтобы каталог пакета был добавлен к вашему пути, а только родительский каталог. Поэтому, если у вас есть '/ home/username/python/foo' в качестве вашего пакета, то вы хотите, чтобы'/home/username/python' был на вашем пути, чтобы вы могли импортировать 'foo' и' foo.csv' и т. Д. Поместите любые скрипты в '/ home/username/python'. –

Смежные вопросы