You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python subprocess.Popen未识别last命令-F参数问题求助

解决subprocess调用last -F参数不生效的问题

我之前也碰到过类似的坑,这大概率是参数传递方式不对或者环境变量差异导致的,咱们一步步来排查解决:

1. 修正shell=True时的参数传递逻辑

你当前用shell=True时传了列表['last', '-F'],这个写法有问题:当shell=True时,列表的第一个元素是shell程序(比如/bin/sh),后面的元素会被当作shell的启动参数,而不是传递给last命令。正确的写法有两种:

  • 直接把整个命令写成字符串:
    proc = subprocess.Popen('last -F', stdout=subprocess.PIPE, shell=True)
    
  • 或者明确指定shell并传入完整命令:
    proc = subprocess.Popen(['/bin/sh', '-c', 'last -F'], stdout=subprocess.PIPE, shell=True)
    

2. 确保shell=False时调用正确的last命令

shell=False时,列表传参是标准写法,但有可能脚本环境的PATH和命令行不一致,导致调用了其他版本的last(或者找不到正确的命令)。解决方法是用last的绝对路径:

先在命令行执行which last,得到类似/usr/bin/last的路径,然后在脚本里替换:

proc = subprocess.Popen(['/usr/bin/last', '-F'], stdout=subprocess.PIPE, shell=False)

3. 排查本地化环境变量的影响

如果上面的方法都不行,可能是脚本的本地化设置(比如LC_TIME)和命令行不同,导致last输出的日期格式不符合预期。可以在脚本里强制设置统一的环境变量:

import os
import subprocess

# 复制当前环境变量并修改时间本地化设置
env = os.environ.copy()
env['LC_TIME'] = 'en_US.UTF-8'

# 用绝对路径调用last并传入环境变量
proc = subprocess.Popen(['/usr/bin/last', '-F'], stdout=subprocess.PIPE, shell=False, env=env)
(output, err) = proc.communicate()
print(output.decode('utf-8'))

快速验证方法

你可以先在脚本里打印output.decode('utf-8'),看看输出是否符合预期。如果还是有问题,先在命令行执行/usr/bin/last -F确认输出格式,再对比脚本的结果,这样能快速定位是命令本身的问题还是脚本调用的问题。

内容的提问来源于stack exchange,提问作者mlecoz

火山引擎 最新活动