![](/img/trans.png)
[英]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.