【问题标题】:How to import this packages? Relative import in python3.3如何导入这个包? python3.3中的相对导入
【发布时间】:2013-05-14 23:32:49
【问题描述】:

我正在尝试让this 在我的机器上工作(arch,使用 gnome 3)。我认为设置正常(我替换了所有打印命令)但是当我在终端上运行 chemlab 时,我收到一个错误,告诉我没有核心包:

[yotam@Standing chemlab-master]$ chemlab
Traceback (most recent call last):
  File "/usr/bin/chemlab", line 5, in <module>
    pkg_resources.run_script('chemlab==0.2', 'chemlab')
  File "/usr/lib/python3.3/site-packages/pkg_resources.py", line 505, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/usr/lib/python3.3/site-packages/pkg_resources.py", line 1246, in run_script
    exec(compile(open(script_filename).read(), script_filename, 'exec'), namespace, namespace)
  File "/usr/lib/python3.3/site-packages/chemlab-0.2-py3.3-linux-i686.egg/EGG-INFO/scripts/chemlab", line 4, in <module>
    import chemlab as cl
  File "/usr/lib/python3.3/site-packages/chemlab-0.2-py3.3-linux-i686.egg/chemlab/__init__.py", line 1, in <module>
    from core.molecule import Molecule, Atom
ImportError: No module named 'core'
[yotam@Standing chemlab-master]$ ls /usr/lib/python3.3/site-packages/chemlab-0.2-py3.3-linux-i686.egg/chemlab/
__init__.py  contrib/     db/          io/          libs/        resources/   
__pycache__/ core/        graphics/    ipython.py   molsim/      utils/       
[yotam@Standing chemlab-master]$ ls /usr/lib/python3.3/site-packages/chemlab-0.2-py3.3-linux-i686.egg/chemlab/

所以我尝试在本地运行文件。我去了相应的文件夹并运行 python __init__.py 不,我明白了

[yotam@Standing chemlab]$ python __init__.py
Traceback (most recent call last):
  File "__init__.py", line 1, in <module>
    from core.molecule import Molecule, Atom
  File "/home/yotam/Applications/Chemlab/chemlab-master/chemlab/core/__init__.py", line 1, in <module>
    from .molecule import Molecule, Atom
  File "/home/yotam/Applications/Chemlab/chemlab-master/chemlab/core/molecule.py", line 6, in <module>
    from ..libs.ckdtree import cKDTree
ValueError: attempted relative import beyond top-level package
[yotam@Standing chemlab]$ 

我搜索了一下,发现我可以(应该?)用chemlab.libs.ckdtree import cKDTree替换..libs.ckdtree import cKDTree我这样做只是为了得到

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 文件“./core/init.py”,第 1 行,在 从 .molecule 导入分子、原子 文件“./core/molecule.py”,第 6 行,在 从 chemlab.libs.ckdtree 导入 cKDTree 文件“/usr/lib/python3.3/site-packages/chemlab-0.2-py3.3-linux-i686.egg/chemlab/init.py”,第 1 行,在 从 core.molecule 导入分子、原子 ImportError: 无法导入名称分子

这让我很困惑。我怎样才能导入/运行它?

编辑:文件夹结构:

chemlab
|
|
+  __init__.py
+  core
   |
   |
   +  molecule.py

编辑 2: chemlab/__init__.py 只有一行是 from core.molecule import Molecule, Atom

和 chelab/core/molecule/ 导入部分看起来像

import numpy as np
from collections import Counter
import numpy as np
from copy import copy

from ..libs.ckdtree import cKDTree
from ..db import ChemlabDB
cdb = ChemlabDB()

masses = cdb.get("data", "massdict")

from .attributes import MArrayAttr, MField
from .fields import AtomicField, FieldRequired
from .serialization import data_to_json, json_to_data

【问题讨论】:

    标签: python import relative-path relative-import


    【解决方案1】:

    你有一个循环依赖。但这是由您的chemlab.__init__.py 想要导入core.molecule.Molecule 引起的,它不应该尝试这样做。删除该导入行。

    【讨论】:

    • 导入MoleculeAtomchemlab.__init__.py 中的唯一行。请看我的编辑。我认为循环依赖增加是因为我将 chemlab 而不是 .. 放在了分子.py 的导入部分。这称为 chemlab 的安装版本而不是本地版本。
    • 是的,这是唯一的一行:但它是不必要的一行。删除它。
    • 但是...如果我删除它,我该如何启动程序?
    • 嗯,不是那样的。创建一个单独的文件,称为 main.py,并在那里进行导入。
    • 当我调用..libs 时,我还调用了父文件夹中的__init__.py
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2011-12-17
    • 2019-08-03
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多