【问题标题】:Getting output of shell commands in Python (cron)?在 Python(cron)中获取 shell 命令的输出?
【发布时间】:2015-01-26 05:19:40
【问题描述】:

我正在尝试编写一个脚本来检测我当前的 wifi 连接并在我的本地计算机上启动一个 socks 代理。 当我自己执行脚本时,脚本本身运行良好。因为我希望一切都是自动的,所以我正在考虑使用 crontab。唯一的问题是 crontob 本身没有输出左右,因此这些方法返回一个空字符串。

有人对此有解决方案吗?我的脚本如下所示:

#!/usr/bin/python
from subprocess import Popen, PIPE
import re, os

location = Popen(['networksetup', '-getcurrentlocation'], stdout=PIPE).stdout.read().split('\n')[0]

ssid = ''
for item in Popen(['/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', '-I'], stdout=PIPE).stdout.read().splitlines():
    if ' SSID' in item:
        ssid = item.strip().split(': ')[-1] 

if location != 'xyz' and ssid == 'abc':
    # start socks proxy
    pass

elif location == 'xyz' and ssid != 'abc':
    # kill socks proxy
    pass

print location, '|', ssid

如果有人想知道,我正在使用 Mac OS 10.10.1。

【问题讨论】:

  • 你的 crontab 文件是什么样的?
  • */10 * * * * python /Users/Exceen/Scripts/autoproxy.py

标签: python shell cron crontab


【解决方案1】:

实际上Popen 应该在您多次运行和通过 cron 运行时返回进程输出。

  1. 尝试将 stderr 重定向到 Popend 内部的 stdout:stderr=sys.stdout.buffer (python3) 并读取输出,为什么无法执行命令。

  2. 可能您的脚本以root 运行(如果您编辑了/etc/crontab),请尝试将行更改为
    */10 * * * * Exceen python /Users/Exceen/Scripts/autoproxy.py

  3. 尝试将完整路径写入networksetup 二进制文件。 Cron 作业可以有不同的$PATH,缺少 /usr/bin/(或 networksetup 所在的任何位置)

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2012-02-07
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2020-01-24
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多