2015-01-22 1 views
0

Я новичок в Python, и у меня много разочарований, пытаясь понять проблему с модулем, над которым я работаю. До сих пор весь процесс был выполнен путем запуска файла __main__.py. Я тестировал код с разными примерами, но всегда внутри __main__.py. Теперь, когда я хочу протестировать модуль с за пределами, я устанавливаю его (все идет хорошо). Но затем, когда я пытаюсь загрузить модуль, который я установил, он дает мне ошибки импорта, которые не отображались, когда я работал с __main__.py. Ошибка заключается в следующем:не может загрузить мой собственный модуль после установки

$ python3 
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import hybrida 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/aaragon/.virtualenvs/pydev/lib/python3.4/site-packages/hybrida-0.1.0-py3.4.egg/hybrida/__init__.py", line 3, in <module> 
    from . import fem 
    File "/Users/aaragon/.virtualenvs/pydev/lib/python3.4/site-packages/hybrida-0.1.0-py3.4.egg/hybrida/fem/__init__.py", line 4, in <module> 
    from . import input 
    File "/Users/aaragon/.virtualenvs/pydev/lib/python3.4/site-packages/hybrida-0.1.0-py3.4.egg/hybrida/fem/input.py", line 5, in <module> 
    from .mesh.formats import readers 
    File "/Users/aaragon/.virtualenvs/pydev/lib/python3.4/site-packages/hybrida-0.1.0-py3.4.egg/hybrida/fem/mesh/__init__.py", line 3, in <module> 
    from . import mesh 
    File "/Users/aaragon/.virtualenvs/pydev/lib/python3.4/site-packages/hybrida-0.1.0-py3.4.egg/hybrida/fem/mesh/mesh.py", line 14, in <module> 
    from . import formats 
    File "/Users/aaragon/.virtualenvs/pydev/lib/python3.4/site-packages/hybrida-0.1.0-py3.4.egg/hybrida/fem/mesh/formats/__init__.py", line 5, in <module> 
    from . import abaqus 
    File "/Users/aaragon/.virtualenvs/pydev/lib/python3.4/site-packages/hybrida-0.1.0-py3.4.egg/hybrida/fem/mesh/formats/abaqus.py", line 7, in <module> 
    from fem.conditions import Dirichlet 
ImportError: No module named 'fem' 

Так что я не понимаю, что происходит, потому что ясно, что модуль импортируется, когда я бегу от __main__.py. Единственное, что я могу придумать, это то, что существует некоторая круговая зависимость, когда я пытаюсь загрузить модуль извне, fem находится сверху и в то время как загружен его пока не видно, t импортировать его. Но если это так, то как в мире я решаю эту проблему?

Структура проекта заключается в следующем:

$ tree . 
. 
├── AUTHORS.rst 
├── CHANGELOG.rst 
├── MANIFEST.in 
├── README.rst 
├── appveyor.yml 
├── bootstrap.py 
├── setup.cfg 
├── setup.py 
└── src 
    ├── hybrida 
   │   ├── __init__.py 
   │   ├── __main__.py 
   │   ├── fem 
   │   │   ├── __init__.py 
   │   │   ├── conditions 
   │   │   │   ├── __init__.py 
   │   │   │   ├── dirichlet.py 
   │   │   │   └── neumann.py 
   │   │   ├── input.py 
   │   │   ├── mesh 
   │   │   │   ├── __init__.py 
   │   │   │   ├── elements 
   │   │   │   │   ├── __init__.py 
   │   │   │   │   ├── common.py 
   │   │   │   │   ├── element.py 
   │   │   │   │   ├── quadrangle.py 
   │   │   │   │   ├── quadrature.py 
   │   │   │   ├── formats 
   │   │   │   │   ├── __init__.py 
   │   │   │   │   ├── abaqus.py 
   │   │   │   │   ├── gmsh.py 
   │   │   │   │   ├── groups.py 
   │   │   │   │   └── vtk.py 
   │   │   │   ├── material 
   │   │   │   │   ├── __init__.py 
   │   │   │   │   └── stress.py 
   │   │   │   └── mesh.py 
   │   │   ├── simulation.py 
   │   │   └── step.py 
   │   └── utils 
   │    ├── __init__.py 
   │    └── classes.py 
   └── hybrida.egg-info 
    ├── PKG-INFO 
    ├── SOURCES.txt 
    ├── dependency_links.txt 
    ├── entry_points.txt 
    ├── not-zip-safe 
    └── top_level.txt 

UPDATE

Мой config.py файл:

#!/usr/bin/env python3 

# -*- encoding: utf-8 -*- 
import glob 
import io 
import re 
from os.path import basename 
from os.path import dirname 
from os.path import join 
from os.path import splitext 

from setuptools import find_packages 
from setuptools import setup 


def read(*names, **kwargs): 
    return io.open(
     join(dirname(__file__), *names), 
     encoding=kwargs.get("encoding", "utf8") 
    ).read() 

setup(
    name="hybrida", 
    version="0.1.0", 
    license="BSD", 
    description="Enter a description for hybrida here", 
    long_description="%s\n%s" % (read("README.rst"), re.sub(":obj:`~?(.*?)`", r"``\1``", read("CHANGELOG.rst"))), 
    author="Alejandro M. Aragon", 
    author_email="[email protected]", 
    url="https://github.com/alejandro-aragon/hybrida", 
    packages=find_packages("src"), 
    package_dir={"": "src"}, 
    py_modules=[splitext(basename(i))[0] for i in glob.glob("src/*.py")], 
    include_package_data=True, 
    zip_safe=False, 
    classifiers=[ 
     # complete classifier list: http://pypi.python.org/pypi?%3Aaction=list_classifiers 
     "Development Status :: 5 - Production/Stable", 
     "Intended Audience :: Developers", 
     "License :: OSI Approved :: BSD License", 
     "Operating System :: Unix", 
     "Operating System :: POSIX", 
     "Operating System :: Microsoft :: Windows", 
     "Programming Language :: Python", 
     "Programming Language :: Python :: 2.6", 
     "Programming Language :: Python :: 2.7", 
     "Programming Language :: Python :: 3", 
     "Programming Language :: Python :: 3.3", 
     "Programming Language :: Python :: 3.4", 
     "Programming Language :: Python :: Implementation :: CPython", 
     "Programming Language :: Python :: Implementation :: PyPy", 
     "Topic :: Utilities", 
    ], 
    keywords=[ 
     # eg: "keyword1", "keyword2", "keyword3", 
    ], 
    install_requires=[ 
     # eg: "aspectlib==1.1.1", "six>=1.7", 
    ], 
    extras_require={ 
     # eg: 'rst': ["docutils>=0.11"], 
    }, 
    entry_points={ 
     "console_scripts": [ 
      "hybrida = hybrida.__main__:main" 
     ] 
    } 

) 
+0

Вы можете разместить установку .py? – reptilicus

+0

@reptilicus Я обновил сообщение с файлом setup.py – aaragon

ответ

1

Проблема заключается в том, что из abaqus, fem ISN» можно найти. Обычно вы решить эту проблему, используя полный путь:

from hybrida.fem.conditions import Diriclet 

В качестве альтернативы, вы можете использовать относительный импорт пакетов:

from ....conditions import Diriclet 

, но как только вы начнете получать слишком много точек, там становится кошмаром расхлебывать и на самом деле больше не стоит того.

Как и в стороне (это полностью мое мнение по этому вопросу), я считаю, что пакет относительного импорт хорош до тех пор, пока вы не должны идти вверх по дереву:

from .foo import Bar # Ok 
from . import something # Ok 
import .baz # Yep 
from ..foo import something # Meh, not worth the confusion... 
+0

Если я это сделаю, я больше не могу работать с '__main __. Py'. Он говорит 'ИмпортError: Нет модуля с именем 'hybrida'' – aaragon

+0

Для разработки вы можете поместить каталог, в котором hybrida живет в вашей переменной окружения PYTHONPATH, хотя я чувствую, что должен быть лучший способ ... (я на самом деле не потратил много времени занимаюсь подобным делом на python3.x) – mgilson

+0

, но я не единственный, кто будет заниматься разработкой этого кода, и я хочу сделать его простым, чтобы другим не приходилось решать эти проблемы , – aaragon