Skip to main content
 首页 » 编程设计

python之Django 1.8 在升级到 Python 3.5 后引发错误 "module X has no attribute ' run'"

2024年11月24日30JeffreyZhao

我有一个在 Django 1.8.4 下运行的 Django 项目,我正在尝试升级到最新版本的 Django。由于我仍在 Debian 8 服务器上使用 Python 2.7,因此我首先将服务器升级到 Debian 9,然后将 Django 项目的虚拟环境升级到 Python 3.5.3(Debian 9 上 Python 3 的默认版本)。

在我重建虚拟环境以使用 Python 3 之后,我运行了命令 2to3 -w .在我项目的根文件夹中。 2to3毫无困难地发现并修复了 62 个问题。我还有 216 个单元测试,其中只有两个在 Python 3.5 下失败了。

然后我访问了我的 Django 网站,除了包含下拉元素的表单显示“SomeThingobject”而不是 SomeThing 表中的值外,该网站似乎可以正常工作。我直接对数据库运行了一些 SQL 查询,并确认我的 SomeThing 查找表已填充。

现在我想在 Python shell 中运行一个 Django queryset 命令,如下所示,看看为什么我的下拉菜单没有显示我的列值:

    queryset=SomeThing.objects.all() 

但是,如果我激活我的虚拟环境并尝试运行命令 ./manage.py shell ,我收到以下错误:

Traceback (most recent call last): 
  File "./manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line 
    utility.execute() 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/__init__.py", line 330, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/base.py", line 393, in run_from_argv 
    self.execute(*args, **cmd_options) 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/base.py", line 444, in execute 
    output = self.handle(*args, **options) 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 69, in handle 
    self.run_shell(shell=options['interface']) 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 58, in run_shell 
    return getattr(self, shell)() 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 41, in ipython 
    ip() 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/django/core/management/commands/shell.py", line 34, in _ipython 
    from IPython import start_ipython 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/IPython/__init__.py", line 48, in <module> 
    from .terminal.embed import embed 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/IPython/terminal/embed.py", line 19, in <module> 
    from IPython.terminal.ipapp import load_default_config 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/IPython/terminal/ipapp.py", line 30, in <module> 
    from IPython.core.magics import ScriptMagics 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/IPython/core/magics/__init__.py", line 22, in <module> 
    from .execution import ExecutionMagics 
  File "/srv/https/my_project.com/venvs/0bc664fa2a7b562d0b7e42a7acb3f095fe5df3cf/lib/python3.5/site-packages/IPython/core/magics/execution.py", line 21, in <module> 
    import cProfile as profile 
  File "/usr/lib/python3.5/cProfile.py", line 22, in <module> 
    run.__doc__ = _pyprofile.run.__doc__ 
AttributeError: module 'profile' has no attribute 'run' 

现在我的 INSTALLED_APPS 中确实有一个名为“profile”的应用程序。如果我尝试在仍在使用 Python 2.7 的生产服务器上打开 Python shell,则 shell 会毫无问题地执行。只有 Python 3.5 有这个问题。有趣的是,我的 Django 1.8/Python 2.7 项目包含 .pyc文件,但现在在 Python 3 下,它们被替换为 __pycache__/<filename>.cpython-35.pyc文件。

我阅读了 Django 文档 Porting to Python 3但它似乎并没有暗示这个问题。我该怎么做才能让这个Django项目在Python 3.5下正常运行? Python 3.5 中是否有可能与我的 profile 冲突的新内容?应用程序还是其他东西?

请您参考如下方法:

在深入研究 Python 代码后,我推测问题是由于我在 Django 项目中的一个应用程序被称为“配置文件”,这与较新版本的 cPython 中的配置文件模块冲突在 Python 3.5 中。在我将应用程序的名称更改为“userprofile”之后,我可以毫无问题地启动 shell。这两篇文章帮助我更改了应用程序的名称:

计算器:How to change the name of a Django app?

How to Change Name of Django Application