2015-12-17 4 views
2

Я следующая структурой папок для проекта Python 3, где vehicle.py является основным скриптом и папка stats рассматривается как пакет, содержащие несколько модулей:Импорт функций непосредственно из Python 3 модуля

enter image description here

cars модуль определяет следующие функции:

def neon(): 
    print('Neon') 
    print('mpg = 32') 


def mustang(): 
    print('Mustang') 
    print('mpg = 27') 

Использование Python 3, я могу получить доступ к функции в каждом модуле внутри vehicle.py, как Ф.О. llows:

import stats.cars as c 

c.mustang() 

Однако, я хотел бы получить доступ к функциям, определенным в каждом модуле непосредственно, но я получаю сообщение об ошибке при этом:

import stats as st 

st.mustang() 
# AttributeError: 'module' object has no attribute 'mustang' 

Я также попытался размещения __init__.py файл в stats папка со следующим кодом:

from cars import * 
from trucks import * 

, но я все еще получаю ошибку:

import stats as st 

st.mustang() 
# ImportError: No module named 'cars' 

Я пытаюсь использовать тот же подход, как NumPy, такие как:

import numpy as np 

np.arange(10) 
# prints array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

Как я могу создать пакет, как NumPy в Python 3 для доступа к функциям непосредственно в модулях?

+0

люди говорят '__init __ py' является обязательным для создания пакета не слышал о [неявным. пакеты пространства имен] (https://www.python.org/dev/peps/pep-0420/); вот почему ваша текущая структура проекта не вызывает ошибки в 'import stats.cars как c'. – user2357112

+0

@ user2357112 Я знаю о неявном пространстве имен в Python 3, но он по-прежнему не заботится об ошибке, которую я вижу. – wigging

ответ

4

Положите __init__.py файл в папке stats (как уже говорили другие), и поместить его в нем:

from .cars import neon, mustang 
from .trucks import truck_a, truck_b 

Не так аккуратно, но проще было бы использовать * подстановочные:

from .cars import * 
from .trucks import * 

Таким образом, сценарий __init__.py выполняет некоторые импортные операции для вас, в свое собственное пространство имен.

Теперь вы можете использовать функции/классы из модуля в neon/mustang непосредственно после того, как вы импортируете stats:

import stats as st 
st.mustang() 
+0

Я пробовал подход '__init __. Py', но я все еще получаю сообщение об ошибке импорта. См. Мой обновленный вопрос. – wigging

+3

Вам нужно указать относительный импорт: 'from .cars import *'. – chepner

+2

Да, это неявный относительный импорт в Python 2-стиле. Вам нужен явный «.cars» относительный импорт. – user2357112

0

добавить пустой файл __init__.py в папку с вашей статистикой, и происходит волшебство.

+0

Я пробовал подход '__init __. Py' и все еще получаю ошибку. – wigging

0

Вы пробовали что-то вроде from cars import stats as c

Вы можете также нуждаться в пустой __init__.py файл в этом каталоге.

host:~ lcerezo$ python 
Python 2.7.10 (default, Oct 23 2015, 18:05:06) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from boto.s3.connection import S3Connection as mys3 
>>> 
+0

import stats.cars as c === from stats import cars as c –

0

Вам нужно создать __init__.py файл в папку статистики.

Файлы __init__.py файлы, необходимые для того, чтобы Python рассматривал каталоги как содержащие пакеты. Documentation

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