django TypeError:join()参数必须是str或bytes,而不是'PosixPath'

tv6aics1  于 2023-04-07  发布在  Go
关注(0)|答案(4)|浏览(269)

因此,我收到以下错误: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)。
有人有办法把我推向正确的方向吗?
先谢谢你,

46qrfjad

46qrfjad1#

只使用pathlib库会使这变得容易得多:

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

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

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

str(MEDIA_ROOT)
3vpjnl9f

3vpjnl9f2#

所以这里的问题是你的BASE_DIR是一个pathlib Path,而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

0qx6xfy6

0qx6xfy63#

1.使用pathlib库的**joinpath()函数。
1.然后使用
str()**函数作为:-str(BASE_DIR.joinpath('db.sqlite3'))

pcww981p

pcww981p4#

这是因为Path(file).resolve().parent.parent返回一个对象。但是对于'join'函数需要一个字符特灵,因此更改:

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

致:

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

相关问题