在Python(cron)中获取shell命令的输出?

时间:2015-01-25 20:19:50

标签: python shell cron crontab

我正在尝试编写一个脚本来检测我当前的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。

1 个答案:

答案 0 :(得分:1)

Actualy 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 /(或者无论网络设置在哪里)