2016-12-07 3 views
0

Я использую python 2.7 в среде linux, и у меня возникли проблемы с импортированием файла .py при определенных условиях. Мой каталог дерево выглядит следующим образом:python не импортирует из текущего каталога

/mainFolder 
    executable.py 
    /Folder 
     input_file.py 

executable.py импорт input_file.py с линии __import__('input_file')

Когда я нахожусь в папке mainFolder/Folder и я бегу ../executable.py я получаю выход: ImportError: No module named input_file

И когда я переместить input_file.py в mainFolder он работает. От взгляда на это у меня создается впечатление, что input_file.py не находится на пути python, и я знаю, как это исправить.

У меня сложилось впечатление, что он должен работать так, как есть, поскольку это код, который из репозитория github и предположительно работает на компьютере автора, но это, по-видимому, не так.

Есть ли настройка, которую я могу изменить, поэтому мне не нужно делать что-то вроде sys.path.append(0,'mainFolder/Folder')?

+1

Почему вы используете функцию импорта '__import __()' вместо простого слова «import»? –

+0

Я использую '__import __()', потому что я фактически передаю 'executable.py' входной файл в качестве ввода, который он импортирует таким образом, я не хочу, чтобы каждый раз менял' executable.py' Я использую новый входной файл. –

ответ

0

Вы можете легко исправить это

import Folder.input_file 

или

__import__('Folder.input_file') 

Где Folder это имя папки input_file.py находится.

+0

Является ли это причудой Python 2.7, поскольку он работает безупречно с Python 3.5.2 –

+1

Woops, вы правы! –

+0

Для работы вам может понадобиться '__init __. Py' в' Folder'. Он может быть пустым. –

2

"пакеты" в питона идентифицируются файл под названием

__init__.py

в корне этой папки пакета.

В этом случае, ваше дерево должно выглядит как:

/mainFolder 
    executable.py 
    /Folder 
     **__init__.py** 
     input_file.py 

В этом случае, если вы хотите, модуль импорта: input_file в качестве модуля, вы можете объявить в исполняемом:

from Folder import input_file 

или даже

from Folder.input_file import * 
from Folder import * 

В качестве альтернативы и последующего объяснения найдено в this response, я реализую ред пример для вашей структуры каталогов:

executable.py содержимого файла:

Folder = __import__('Folder.input_file') 
print(Folder.input_file.summm(1,2)) 

input_file.py содержимого файла:

def summm(a, b): 
    return a+b 

Это некрасиво, но было построить пример следующих исходной структуры. В этом случае не обязательно добавлять файл __init__.py внутри папки Folder.

+0

Я тоже об этом думал, но в репозитории github нет файлов __init__.py и не должен ли python распознавать пакеты, находящиеся в каталоге, в котором вы находитесь, в вашей операционной системе? –

+0

James, я отредактировал сообщение для структуры, которую вы описали. Он работает в вашем случае? – apast