【问题标题】:Python: import models in sub packagePython:在子包中导入模型
【发布时间】:2016-05-18 17:51:43
【问题描述】:

我对 Python 还是很陌生,现在我一直在与 import 作斗争以退出。我无法完全理解这个概念。我在导入概念完全不同的 ruby​​ 方面有经验。

1.情况 我有这个包

├── convortal
│   ├── dbconf.yaml                                                                                            
│   ├── helpers.py                                                                                             
│   ├── __init__.py                                                                                            
│   ├── models                                                                                                 
│   │   ├── company.py                                                                                         
│   │   ├── country.py                                                                                         
│   │   ├── ez_key.py                                                                                          
│   │   ├── __init__.py                                                                                        
│   │   ├── __init__.pyc                                                                                       
│   │   ├── product_function.py                                                                                
│   │   ├── __pycache__                                                                                        
│   │   │   ├── company.cpython-34.pyc                                                                         
│   │   │   └── __init__.cpython-34.pyc                                                                        
│   │   └── traveler_profile.py                                                                                
│   └── __pycache__                                                                                            
│       └── __init__.cpython-34.pyc                                                                            
├── README.md                                                                                                  
├── requirements.txt                                                                                           
└── setup.py

convortal/__init___.py

import sys
from convortal.models import *
import convortal.helpers as hp

from dbconn import CtrlSession
from sqlalchemy import desc

# DECLARATIONS FOR SETUP.PY
APP_NAME = 'convortal'
__versionnum__ = ('0','0','1')
APP_VERSION = '.'.join([i for i in __versionnum__])

def convortal(argv):
....(code to read file and update DB)

convortal/models/__init__.py

__all__ = [
    'Company',         
    'Country',         
    'EzKey',
    'ProductFunction', 
    'TravelerProfile', 
]

from dbconn import DBconn
from convortal.models.company import Company
from convortal.models.country import Country
from convortal.models.ez_key import EzKey
from convortal.models.product_function import ProductFunction
from convortal.models.traveler_profile import TravelerProfile
# create a connection to the DB 
conn = DBconn('PROD')  
# instantiate a Base object with this connection
Base = conn.Base()

公司模型:convortal/models/company.py

import convortal
from sqlalchemy import Table, Column, Integer, ForeignKey, UniqueConstraint
from sqlalchemy.orm import relationship
from models import Base

class Company(Base):
...company table with autoload

我想要达到的目标

我正在尝试创建一个可以导入的包,以便将此代码与检查目录、收集用户文件并使用此包更新、创建或停用此用户的例程一起使用。

我也在尝试从命令行执行这样的应用程序来测试它

(venv) ➜  convortal git:(master) ✗ python convortal/__init__.py

__init__.py 有 if 语句

if __name__ == '__main__':
    convortal(sys.argv[1:])

运行此命令应退出应用程序并显示带有帮助字符串的消息,显示执行应用程序所需的参数。

问题

我遇到了这个错误:

Traceback (most recent call last):
  File "convortal/__init__.py", line 2, in <module>
    from convortal.models import *
ImportError: No module named 'convortal'

【问题讨论】:

  • 为什么不只是from .models import ...。你有没有运行setup.py 来实际安装应用程序?
  • 试过了,没用。我正在使用 ipython 导入包,但如果我在模型 __init__.py 文件中包含导入和 __all__ 变量,我会得到相同的错误。删除模型的导入,我能够使它工作。谢谢

标签: python import package structure


【解决方案1】:

在我的经理的帮助下奋斗了一周后,我们终于找到了解决方案。我只是想分享它以防其他人遇到同样的问题。

项目布局

├── dbconf.yaml
├── helpers.py
├── __init__.py
└── models
    ├── company.py
    ├── country.py
    ├── ez_key.py
    ├── __init__.py
    ├── product_function.py
    └── traveler_profile.py

convortal/__init__.py

import sys
from . models import *
from . import helpers as hp
from sqlalchemy import desc

# DECLARATIONS FOR SETUP.PY
APP_NAME = 'convortal'
__versionnum__ = ('0','0','1')
APP_VERSION = '.'.join([i for i in __versionnum__])

def convortal(site_path, country_abbr):
....(code to read file and update DB)

convortal/models/__init__.py

__all__ = [
    'Company',
    'Country',
    'EzKey',
    'ProductFunction',
    'TravelerProfile',
]

from dbconn import DBconn
# create a connection to the DB
conn = DBconn('prod')
# instantiate a Base object with this connection
Base = conn.Base()

from . company import Company
from . country import Country
from . ez_key import EzKey
from . product_function import ProductFunction
from . traveler_profile import TravelerProfile

公司模型:convortal/models/company.py

from sqlalchemy import Table, Column, Integer, ForeignKey, UniqueConstraint
from sqlalchemy.orm import relationship
from .. models import Base

class Company(Base):
...company table with autoload

通过这种布局,我能够从 convortal/__init__.py 查询数据库并维护表之间的关系。

要执行请求,在这种情况下,您必须按照以下步骤操作: 1. 实例化一个会话:

session = convortal.models.conn.get_session()

  1. 提出请求

qtest = session.query(convortal.models.EzCompany).filter_by(some_property=value)

convortal/models/__init__.py 中的顺序很重要。因为我在模型包的其余模块中使用Base,所以我必须在导入模型之前创建Base 变量

不使用from . models import *需要重构

【讨论】:

    猜你喜欢
    • 2017-02-25
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多