'import ase' не загружает подмодуль 'ase.io' - PullRequest
1 голос
/ 19 февраля 2020

У меня возникла проблема с использованием «модуля импорта» вместо синтаксиса «из модуля импорта ...». Это ясно показывает, что моего понимания загрузки модулей недостаточно. Насколько я нахожу в другом месте, это различие в основном связано со стилем, но это не объясняет следующую ситуацию.

Я установил ase, используя

sudo apt install python3-ase

Я попробовал следующее:

import ase
ase.io.read

который выводит

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'ase' has no attribute 'io'

Однако, при попытке

from ase.io import read
read

или - также возможно -

from ase.io import read
import ase
ase.io.read

Я получаю вывод

<function read at 0x7f33dc721730>

Последнее является желаемым результатом, так как я хочу использовать функцию ase.io.read для чтения файла .cif.

Подробнее о происхождении проблемы показано в следующий python сеанс:

import sys
import ase
sys.modules['ase']

модуль 'ase' из /home/vanbeverj/Programs/anaconda3/envs/abienv/lib/python3.6/site-packages/ase/ init .py '

dir(ase)

[' Atom ',' Atoms ',' LooseVersion ',' all ',' встроенные ', ' cached ', ' do c', ' file ', ' loader ', ' name ',' пакет ',' путь ',' spe c ',' версия ',' ase ', 'атом', ' атомов, калькуляторы, ячейка, ограничения, данные, dft, формула, геометрия, np, параллель, символы, sys, транспорт , 'units', 'utils']

from ase.io import read
dir(ase)

['Atom', 'Atoms', 'LooseVersion', ' all ', ' встроенные ' , ' кэшировано ', ' do c', ' file ', ' loader ', ' name ',' package ',' path ',' spe c ',' version ',' ase ' , «атом», «атомы», «калькуляторы», «ячейка», «ограничения», «данные», «dft», «формула», «геометрия», «io», «np», «параллель», « символы ',' sys ',' transport ',' units ',' utils ']

Команды' dir (ase) 'имеют явно разные выходы. Что происходит, например, с субмодулем io? Может кто-нибудь объяснить мне, что происходит под капотом?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Каждый пакет должен представлять ли импортированный субмодуль как атрибут или импортировать субмодуль вообще.

os, например, импортирует и выставляет os.path.

В вашем случае ase не не предоставляет субмодуль io как атрибут ase. (Был ли импортирован io - это другой вопрос; вы можете проверить sys.modules.)

1 голос
/ 19 февраля 2020

Я думаю, что это похоже на tkinter. В tkinter, если мы хотим использовать ttk, мы должны использовать

import tkinter
from tkinter import ttk 

, если мы используем

import tkinter

.......
btn = tkinter.ttk.Button(xxxxxx)

Тогда будет показано AttributeError: module 'tkinter' has no attribute 'ttk'.

Вы можете видеть исходный код модуля ase. В файле> __init__.py, import ase означает, что импортируется весь класс или функция в __init__.py.

from ase import io, возможно, это означает, что он импортирует модуль io (io - независимый файл .py) в папку

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...