TypeError:join()参数必须为str或字节,而不是'PosixPath'

时间:2020-10-01 11:16:16

标签: python django

因此,我收到以下错误: TypeError: join() argument must be str or bytes, not 'PosixPath'

在Ubuntu 16.04上检查我的Django安装时会发生这种情况。 完整的错误将是:

    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  File "/usr/lib/python3.5/posixpath.py", line 89, in join
    genericpath._check_arg_types('join', a, *p)
  File "/usr/lib/python3.5/genericpath.py", line 143, in _check_arg_types
    (funcname, s.__class__.__name__)) from None
TypeError: join() argument must be str or bytes, not 'PosixPath'

这是来自settings.py文件。

在文件中,我有:

from pathlib import Path
import os

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

在我的开发环境中,它正在运行并正在运行,但是在这里,我收到错误消息。 生产中的Python版本为3.5.1-3。 正常情况下,软件包的安装方式也应相同(pip Frozen / install -r)。

有人想把我推向正确的方向吗?

预先感谢

3 个答案:

答案 0 :(得分:1)

因此,这里的问题是您的BASE_DIR是pathlib路径,而os.path.join通常可用于字符串。我将改为使用纯pathlib,如下所示:

from pathlib import Path
import os

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
...
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'static'

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

这使pathlib可以处理路径联接,并且碰巧更简单易读(意见)。

编辑:仅想补充一点,从python 3.6开始,os.path.join应该处理所有类似路径的对象,这就是为什么它在某些环境下可以工作的原因-请参阅文档: https://docs.python.org/3/library/os.path.html#os.path.join

答案 1 :(得分:1)

仅使用pathlib库将使其变得更加容易:

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

STATIC_ROOT = BASEPATH.joinpath('static')
MEDIA_ROOT = BASEPATH.joinpath('media')

PosixPath提供了更大的自由度,例如仅指定文件名或文件列表。最终,您始终可以将PosixPath转换为字符串:

str(MEDIA_ROOT)

答案 2 :(得分:0)

这是因为Path( file )。resolve()。parent.parent返回一个对象。但是对于“加入”功能,需要进行调整,因此请更改:

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

收件人:

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