使用pathlib将目录添加到sys.path

35

我正在尝试使用如下代码将目录添加到PATH:

PROJECT_DIR = Path(__file__).parents[2]
sys.path.append(
    PROJECT_DIR / 'apps'
)

它不起作用。如果我打印sys.path,我会看到类似这样的内容:

[..., PosixPath('/opt/project/apps')]

我应该如何修复这段代码?写str(PROJECT_DIR / 'apps')是正常的吗?


1
为什么你要避免使用 str - hiro protagonist
3
我不想回避这个问题。我只是想问一下使用pathlib的正确方式是什么。 - kharandziuk
4个回答

49

文档中得知:

程序可以自由地修改此列表以适应自身目的。 sys.path 只能添加字符串;在导入期间,所有其他数据类型都将被忽略。

将路径作为字符串添加到sys.path中:

PROJECT_DIR = Path(__file__).parents[2]
sys.path.append(
    str(PROJECT_DIR / 'apps')
)
PROJECT_DIRPosixPath 的一个实例,它有所有诸如/.parents等好处。如果您想将其附加到sys.path中,您需要将其转换为str类型。

1
在将路径添加到sys.path之前,您可能需要使用resolve()方法。这将使其成为绝对路径——因为__file__并不总是绝对路径。 - florisla
@florisla 因为这是在运行时完成的,所以没有必要这样做(只要在导入模块之前不移动它们)。 - hiro protagonist

6

支持将路径对象添加到sys.path中的功能即将到来(请参见此拉取请求),但目前还未实现。


0

您也可以使用os.fspath。它返回路径的文件系统表示。

import os
    
PROJECT_DIR = Path(__file__).parents[2]
APPS_DIR = PROJECT_DIR / 'apps'
sys.path.append(os.fspath(APPS_DIR))

Documentation: https://docs.python.org/3/library/os.html#os.fspath



-11
project_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)),"..","..")
sys.path.append(os.path.join(project_dir,"apps"))
#or maybe you need it at the start of the path
sys.path.insert(0,os.path.join(project_dir,"apps"))

为什么你要使用这个奇怪的pathlib库,而不是Python已经很好用的路径工具呢?

1
这并没有回答问题。 - vaultah
2
我猜你在回答中错过了.parents[2]这一部分。 - kharandziuk
1
@Joran Beasley:尽管放心留下答案!os.path是一个非常好的库!对于Python <3,pathlib的东西都不会起作用。 - hiro protagonist
1
除非您明确知道使用内置函数会导致错误,否则请使用内置函数。如果出现错误,这些错误可能会很难解决,需要向 Stack Overflow 寻求帮助 :P 但是我仍然建议在适合任务的情况下使用内置函数。@hiroprotagonist 哈哈,我把它读成了 Python 爱心而不是 Python 小于 3 的符号 :P - Joran Beasley
2
Python爱!(而且:pathlib是Python> 3中内置的,显然已经被移植到Python 2. *中[正如kharandziuk所提到的])。 - hiro protagonist
显示剩余6条评论

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