Python: 在子包中导入模型

Python: import models in sub package

我是 Python 的新手,我一直在为退出导入而苦苦挣扎。我无法完全理解这个概念。我在 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'

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

项目布局

├── 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 *