在服务器上运行collectstatic时出现错误:AttributeError: 'PosixPath' object has no attribute 'startswith'。

18

在使用nginx、gunicorn、django和virtualenv在Digital Ocean上部署到服务器后,我尝试使用collectstatic:

python manage.py collectstatic --settings=config.settings.production

正如您所看到的,我有多个设置文件。一个基本的,一个本地的和一个生产设置文件。下面是错误:

    Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 173, in handle
    if self.is_local_storage() and self.storage.location:
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/utils/functional.py", line 239, in inner
    return func(self._wrapped, *args)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/tony/vp/vpenv/lib/python3.5/site-packages/django/core/files/storage.py", line 283, in location
    return abspathu(self.base_location)
  File "/home/tony/vp/vpenv/lib/python3.5/posixpath.py", line 357, in abspath
    if not isabs(path):
  File "/home/tony/vp/vpenv/lib/python3.5/posixpath.py", line 64, in isabs
    return s.startswith(sep)
AttributeError: 'PosixPath' object has no attribute 'startswith'

我的production.py设置文件包含以下内容:

MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = 'media/'
STATIC_ROOT = BASE_DIR / 'static'

我的基础目录如下(从基础设置文件中导入):

BASE_DIR = Path(__file__).resolve().parent.parent.parent

可能的原因是什么?

4个回答

14

您正在使用Python 3.5。os模块中对Path对象的支持是在Python 3.6中添加的。您可以:

  • either upgrade to Python 3.6; or

  • avoid using Path objects:

    BASE_DIR = os.path.abspath(os.path.join(__file__, '../../../'))
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    

1
你说得对!我想升级到新版本,但是运行pip install --upgrade python不起作用。我认为我需要重新创建虚拟环境。 - Tony
谢谢,我有Python 3.9,但是遇到了这个问题,但是按照您的答案解决了! - a3k

10
这是我的早期设置。我正在使用Python 3.5和Django 2.1。
BASE_DIR = Path(__file__).resolve().parent.parent.parent
STATIC_ROOT = BASE_DIR / 'static'

我只改了一件事:

STATIC_ROOT = str(BASE_DIR / 'static')

它正常运行。


3
Python 3.8.10 出现了同样的问题。 - Charanjit Singh

1
在我的情况下,这是因为我手动安装了旧版本。新的Python版本(>=3.6)已经包含了pathlib库。
所以我只需运行“pip uninstall pathlib”,这样它就可以使用Python自带的库。当我再次运行代码时,它正常工作。

0
我从一些Databricks内部库中得到了错误。我导入了Pathlib,因为我需要获取当前工作目录。
当我移除了
    from pathlib import Path

和使用

os.getcwd()

为了获取当前目录,它开始工作了。看起来Pathlib将sys.path更改为返回PosixPath对象的列表,而不是字符串列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接