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

enter image description here

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

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


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

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

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 для доступа к функциям непосредственно в модулях?

7
wigging 17 Дек 2015 в 21:09

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()
8
Def_Os 17 Дек 2015 в 19:26

Вы пробовали что-то вроде {{Х0}}

Вам также может понадобиться пустой __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
lcerezo 17 Дек 2015 в 18:23

Вам нужно создать файл __ init __. Py в папке статистики.

Файлы __ init __. Py необходимы для того, чтобы Python рассматривал каталоги как пакеты. Документация

0
Yogesh Yadav 17 Дек 2015 в 18:20

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

0
Stefan Yohansson 17 Дек 2015 в 18:11