如何在 python 中获得 unix 中的最大文件系统路径长度?

Posted

技术标签:

【中文标题】如何在 python 中获得 unix 中的最大文件系统路径长度?【英文标题】:How do I get in python the maximum filesystem path length in unix? 【发布时间】:2015-12-24 18:49:24 【问题描述】:

在我维护的代码中,我遇到了:

from ctypes.wintypes import MAX_PATH

我想把它改成这样的:

try:
    from ctypes.wintypes import MAX_PATH
except ValueError: # raises on linux
    MAX_PATH = 4096 # see comments

但我找不到任何方法从 python (os, os.path, sys...) 获取最大文件系统路径的值 - 有标准方法还是我需要外部库?

或者说linux中没有类似MAX_PATH的,至少不是发行版中的标准?


Answer

try:
    MAX_PATH = int(subprocess.check_output(['getconf', 'PATH_MAX', '/']))
except (ValueError, subprocess.CalledProcessError, OSError):
    deprint('calling getconf failed - error:', traceback=True)
    MAX_PATH = 4096

【问题讨论】:

Linux 上是 4096 - unix.stackexchange.com/questions/32795/… @jonrsharpe:没有编程方式来解决它? 【参考方案1】:

正确的方法是使用带有PC_前缀名称的os.pathconfos.fpathconf

>>> os.pathconf('/', 'PC_PATH_MAX')
4096
>>> os.pathconf('/', 'PC_NAME_MAX')
255

请注意,路径组件的最大长度可能因目录而异,因为它取决于文件系统!

【讨论】:

感谢与接受的答案有什么区别 - 为什么PC_ 前缀属性更正确? @Mr_and_Mrs_D 这会在几纳秒内调用一个 python 函数,并且接受的答案执行一个 unix shell (bash),该程序执行一个获取值并返回该值的程序值作为字符串。 谢谢 - 我的意思是 PC_PATH_MAXPATH_MAX。我猜PC代表pathconfig?我查询不同的变量似乎很奇怪 @Mr_and_Mrs_D 这些是(不幸的是)C 库常量名称,尽管在 Python 中这不是必需的。我不知道该怪谁。【参考方案2】:

您可以从文件中读取这些值:

* PATH_MAX (defined in limits.h)
* FILENAME_MAX (defined in stdio.h)

或者使用带有getconf函数的subprocess.check_output():

$ getconf NAME_MAX /
$ getconf PATH_MAX /

如下例:

name_max = subprocess.check_output("getconf NAME_MAX /", shell=True)
path_max = subprocess.check_output("getconf PATH_MAX /", shell=True)

获取值,fpath 为文件设置不同的值。

【讨论】:

第一件事 - shell=True 是否用于避免传递绝对路径?这个 getconf 调用是否可移植?我是否需要 root 权限才能使用它? 1. shell=True 使指定的命令将通过 shell 执行 2. getconf 调用在 unix/linux 系统中是可移植的,而不是在 windows 3 中。不需要 root 好吧 +1 额外的努力 - 1. shell=True - 我知道它的作用,但它在这里有什么不同(我没有测试 - 我得到 OSError: [Errno 2] No such file or directory - 为什么?)?换句话说,你能用 Popen 重写它吗? 4. 显然我应该捕获 CalledProcessError and OSError and ....? 1.你在这里:name_max = subprocess.check_output(["getconf", "NAME_MAX", "/"], shell=False) = name_max = subprocess.Popen("getconf NAME_MAX /", stdout=subprocess.PIPE, shell=True) = name_max = subprocess.Popen(["getconf", "NAME_MAX", "/"], stdout=subprocess.PIPE, shell=False) 当你传递 shell=True 时,Popen 需要一个字符串参数,而不是一个列表。如果 args 是一个序列['1', , ],第一项指定命令字符串,任何附加项都将被视为 shell 本身的附加参数。 4.细微的区别是如果子进程返回非零退出状态, check_output 将引发 Python 错误。使用 Popen,您可以控制:name_max = subprocess.Popen("getconf NAME_MAX /", stdout=subprocess.PIPE, shell=True) output, error = process.communicate() retcode = process.poll()

以上是关于如何在 python 中获得 unix 中的最大文件系统路径长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在servlet中获得session的值,并且把获得的值赋给网页中的文本域

如何在 Python 中使用 tesseract 获得图像中最大的文本?

C++:我将如何获得 unix 时间?

相同的逻辑适用于c ++,但不适用于python以获得堆栈中的最大值,我的代码中是不是缺少某些东西

如何在Python中使用numpy获取累积最大索引?

Python - 嵌套字典中的最大值键,泛化