【问题标题】:Python3 use imported module in function djangoPython3 在函数 django 中使用导入的模块
【发布时间】:2019-06-22 11:03:20
【问题描述】:

我从 Djanjo 1.8 升级到 2.1

我注意到当我尝试使用导入的模块时,找不到该模块

示例 #1

from var_dump import var_dump
from django.db import connection

def get_available_id():
    with connection.cursor() as cursor:
        query = """SELECT
        *
        FROM
        `stackoverflow`
        ;"""
        cursor.execute(query)
        row = cursor.fetchone()

    return row

var_dump(get_available_id())

这导致NameError: name 'connection' is not defined

完全转储

root@fbb4988d3d17:/var/www/api.domain.com# python manage.py shell < sql/import.py 
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/base.py", line 353, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/commands/shell.py", line 92, in handle
    exec(sys.stdin.read())
  File "<string>", line 27, in <module>
  File "<string>", line 8, in get_available_id
NameError: name 'connection' is not defined

如果我在函数get_answers 中导入connection 模块一切正常

示例 #2

from var_dump import var_dump

def get_available_id():
    from django.db import connection
    with connection.cursor() as cursor:
        query = """SELECT
        *
        FROM
        `stackoverflow`
        ;"""
        cursor.execute(query)
        row = cursor.fetchone()

    return row

var_dump(get_available_id())

这行得通。

我可以做些什么来确保示例 #1 与全局导入一起使用。

我正在运行这样的代码 python manage.py shell &lt; sql/import.py

【问题讨论】:

  • 不,这不会发生。您会收到该错误的唯一原因是您在 get_answers() 函数中重新定义了 connection
  • 或循环导入。
  • @Mathias 不,循环导入会导致 ImportError。
  • 仅供参考,这开始发生在 Python3 和 Django2.1 上。我正在检查我是否遗漏了什么。我也在运行我的 docker
  • @DanielRoseman 哎呀真 :-)

标签: python django python-3.5 django-2.1


【解决方案1】:

通过将我尝试运行的类移动到单独的文件中来解决问题。

#class_a.py
import re
class A:
    def word_to_list(str):
        words = re.split("(\s+)", str)
        return words

a = A()
a.word_to_list('bob is your uncle')

运行 python manage.py shell &lt; sql/class_a.py 导致 NameError: name 're' is not defined

解决办法是

#class_a.py
import re
class A:
    def word_to_list(str):
        words = re.split("(\s+)", str)
        return words

然后

#runner.py
from class_a import A
a = A()
a.word_to_list('bob is your uncle')

运行python manage.py shell &lt; sql/runner.py

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多