[英]TypeError: join() argument must be str or bytes, not 'list'
[英]TypeError: join() argument must be str or bytes, not 'PosixPath'
所以,我收到以下错误: 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 freeze/install -r)。
任何人都有想法将我推向正确的方向?
提前致谢,
仅使用pathlib
库使它变得更容易:
BASEPATH = Path(__file__).resolve().parent.parent
STATIC_ROOT = BASEPATH.joinpath('static')
MEDIA_ROOT = BASEPATH.joinpath('media')
PosixPath 提供了更多的自由来指定,例如,仅文件名或文件列表。 最终,您始终可以将 PosixPath 转换为字符串:
str(MEDIA_ROOT)
所以这里的问题是你的BASE_DIR
是一个 pathlib 路径,而 os.path.join 通常使用字符串。 我会改为使用纯粹的路径库,如下所示:
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
这是因为 Path( file ).resolve().parent.parent 返回一个对象。 但是对于“加入”功能,需要一个字符串,因此更改:
BASE_DIR = Path(__file__).resolve().parent.parent
到:
BASE_DIR = str(Path(__file__).resolve().parent.parent)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.