关于 Django 执行单独文件时导入内部包的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wchluxi
V2EX    Python

关于 Django 执行单独文件时导入内部包的问题

  •  
  •   wchluxi 2021-08-21 07:04:38 +08:00 2495 次点击
    这是一个创建于 1512 天前的主题,其中的信息可能已经有所发展或是发生改变。

    .
    ├── django_web
    │ ├── RealTimeData
    │ │ ├── init.py
    │ │ ├── admin.py
    │ │ ├── apps.py
    │ │ ├── migrations
    │ │ │ ├── 0001_initial.py
    │ │ │ ├── init.py
    │ │ ├── models.py
    │ │ ├── sql_api_test.html
    │ │ ├── templates
    │ │ │ └── RealTimeData
    │ │ │ └── index.html
    │ │ ├── tests.py
    │ │ ├── urls.py
    │ │ └── views.py
    │ ├── init.py
    │ ├── db.sqlite3
    │ ├── django_web
    │ │ ├── init.py
    │ │ ├── asgi.py
    │ │ ├── settings.py
    │ │ ├── urls.py
    │ │ └── wsgi.py
    │ └── manage.py
    └── main.py

    这是文件结构,同时 main.py 处在一个 django_web 的文件夹下。
    现在的问题是:当我单独执行 main.py 文件时,导入 RealTimeData 的模块出现 ModuleNotFoundError 。

    然而在配置 DJANGO_SETTINGS_MODULE 时引用 settings 文件是没问题的。sys.path 也包含了 main.py 的父目录的路径。

    print(sys.path)
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_web.django_web.settings')
    django.setup()

    from django_web.RealTimeData.models import RowRecord

    第 1 条附言    2021-08-23 14:09:39 +08:00

    现在才发现提问题不给报错信息是多么愚蠢,程序在 django.setup()那一步就已经出错。
    ''' (django_env) mac@Luxis-MacBook-Pro django_web % python -m main Traceback (most recent call last): File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/runpy.py", line 87, in _run_code exec(code, run_globals) File "/Users/mac/Documents/gitee_dir/django_web/main.py", line 13, in <module> django.setup() File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/init.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/apps/registry.py", line 91, in populate app_cOnfig= AppConfig.create(entry) File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/apps/config.py", line 212, in create mod = import_module(mod_path) File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/importlib/init.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frzen importlib._bootstrap>", line 973, in _find_and_load_unlocked ModuleNotFoundError: No module named 'RealTimeData' '''

    11 条回复    2021-08-24 00:28:56 +08:00
    sudoy
        1
    sudoy  
       2021-08-21 07:57:19 +08:00
    加个空的 __init__.pymain.py 同级目录下面试试?
    Trim21
        2
    Trim21  
       2021-08-21 08:30:37 +08:00
    你的描述跟 tree 的输出结果好像对不上。

    main.py 处在一个 django_web 的文件夹下”。

    看起来文件路径是这样的 "./main.py" "./django_web/manage.py" "./django_web/django_web/wsgi.py"

    我没理解错的话,你的 main.py 和最上级的那个 django_web 文件夹是同级的?
    wchluxi
        3
    wchluxi  
    OP
       2021-08-21 08:54:00 +08:00
    @Trim21 我在终端创建 django 项目,然后又在 pycharm 创建项目再倒入 django 项目的文件夹。结果是有三个 django_web 的同名文件夹。
    main.py:”django_web/main.py
    settings.py:”django_web/django_web/django_web/settings.py
    手机回复,排版可能不好,请见谅。
    wchluxi
        4
    wchluxi  
    OP
       2021-08-21 08:57:52 +08:00
    @sudoy 我不确定是不是试过这个方法,但还是报错。待会回去再试一下。
    Trim21
        5
    Trim21  
       2021-08-21 09:05:47 +08:00 via Android
    python -m main 运行脚本报错会消失吗?
    wchluxi div class="fr">     6
    wchluxi  
    OP
       2021-08-21 09:18:47 +08:00
    @Trim21 试过并没有
    goodness1900
        7
    goodness1900  
       2021-08-21 11:25:46 +08:00 via iPhone
    django_web.RealTimeData.models 文件的内容打出来看看,models.py 可能有 import 异常
    goodness1900
        8
    goodness1900  
       2021-08-21 11:37:43 +08:00 via iPhone
    另外,整个 django 项目的启动可能也会有问题。按照现在的项目路径(假设.是根目录,也就是./main.py ,./django_web 是同一级),那么如果按照 python -m main 的方式启动,./django_web/中所有模块在引入自身的模块时,如果采用绝对路径应该写成 django_web.xxx.xxx 。除非将./django_web 整个变成一个外部包进行 pip install,就可以像 requests 一样进行 import
    wchluxi
        9
    wchluxi  
    OP
       2021-08-23 10:58:16 +08:00
    @goodness1900
    '''python
    from django.db import models


    # Create your models here.
    class RowRecordManager(models.Manager):
    def create_rowrecord(self, date, acc_name, proj_name, unit_name, imp, clk, cost):
    rowrecord = self.create(r_date=date,r_account=acc_name,
    r_proj=proj_name,r_unit=unit_name,
    r_impression=imp,r_click=clk,
    r_cost=cost
    )
    return rowrecord


    class RowRecord(models.Model):
    r_date = models.DateField()
    r_account = models.CharField(max_length=100)
    r_proj = models.CharField(max_length=100)
    r_unit = models.CharField(max_length=100)
    r_impression = models.DecimalField(max_digits=10, decimal_places=0)
    r_click = models.DecimalField(max_digits=10, decimal_places=0)
    r_cost = models.DecimalField(max_digits=10, decimal_places=2)

    objects = RowRecordManager()

    def __str__(self):
    return '%s,%s,%s,%s,%d,%d,%d' %(str(self.r_date), self.r_account, self.r_proj, self.r_unit, self.r_impression,
    self.r_click, self.r_cost)




    '''
    wchluxi
        10
    wchluxi  
    OP
       2021-08-23 14:07:27 +08:00
    现在才发现提问题不给报错信息是多么愚蠢,程序在 django.setup()那一步就已经出错。
    (django_env) mac@Luxis-MacBook-Pro django_web % python -m main
    ['/Users/mac/Documents/gitee_dir/django_web', '/Users/mac/opt/miniconda3/envs/django_env/lib/python38.zip', '/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8', '/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/lib-dynload', '/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages']
    Traceback (most recent call last):
    File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
    File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/runpy.py", line 87, in _run_code
    exec(code, run_globals)
    File "/Users/mac/Documents/gitee_dir/django_web/main.py", line 13, in <module>
    django.setup()
    File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
    File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/apps/registry.py", line 91, in populate
    app_cOnfig= AppConfig.create(entry)
    File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/site-packages/django/apps/config.py", line 212, in create
    mod = import_module(mod_path)
    File "/Users/mac/opt/miniconda3/envs/django_env/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
    File "<frozen importlib._bootstrap>", line 991, in _find_and_load
    File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
    File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
    File "<frozen importlib._bootstrap>", line 991, in _find_and_load
    File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
    ModuleNotFoundError: No module named 'RealTimeData'
    goodness1900
        11
    goodness1900  
       2021-08-24 00:28:56 +08:00 via iPhone
    提个建议,把 main.py 放到和 manage.py 同一个目录下,main.py 的内容改写成
    print(sys.path)
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_web.settings')
    django.setup()

    from RealTimeData.models import RowRecord

    然后再运行 python -m main
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5604 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 07:53 PVG 15:53 LAX 00:53 JFK 03:53
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86