ImportError:从launchd调用时没有名为bs4的模块

时间:2015-11-24 23:24:08

标签: python launchd bs4 launchdagent

我在一个脚本中运行以下python导入,该脚本在终端和ipython笔记本的命令行中运行良好。

#!/usr/bin/python
import os
import re
import urllib
import urllib2 as ul
import sys
from bs4 import BeautifulSoup as bs

当通过Mac启动从.plist文件调用时,我收到以下错误:

11/24/15 1:17:05 PM com.jerry.sat_images[668]   Traceback (most recent call last):
11/24/15 1:17:05 PM com.jerry.sat_images[668]     File "/Users/jerrykallam/python_practice/sat_image.py", line 6, in <module>
11/24/15 1:17:05 PM com.jerry.sat_images[668]       import bs4
11/24/15 1:17:05 PM com.jerry.sat_images[668]   ImportError: No module named bs4
11/24/15 1:17:05 PM com.apple.launchd.peruser.501[165]  (com.jerry.sat_images[668]) Exited with exit code: 1

从命令行和ipython bs4导入和脚本工作正常。这是似乎正常工作的.plist代码。不知道为什么脚本只有在被launchd调用时才能导入bs4。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.jerry.satimages</string>
        <key>ProgramArguments</key>
        <array>
           <string>python</string>
            <string>/Users/jerrykallam/python_practice/sat_image.py</string>
        </array>
        <key>StartInterval</key>
        <integer>360</integer>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist> 

3 个答案:

答案 0 :(得分:2)

我遇到了这个确切的问题(OS X 10.11.3 El Cap)。将PYTHONPATH添加到EnvironmentVariables不起作用。什么工作是调用python的特定路径。

所以,在ProgramArguments而不是:

   <string>python</string>

......这个:

   <string>/your/python/path</string>

答案 1 :(得分:1)

查看CLI之间的sys.path与从plist运行时的差异。如果bs4模块相对于python路径不在正确的位置,它将无法找到它。

 #!/usr/bin/env python

 import sys
 print sys.path 

使用plist版本,您可能需要:

fd=open('/var/tmp/fred.txt','w') 

ted = sys.path

fd.writelines(ted) 
fd.close() 

而不仅仅是“print sys.path”。

基本上我猜测.xlist文件在你的unix(ish)环境完全设置之前就已经运行了。

答案 2 :(得分:1)

这可能是因为launchd以root身份运行其守护进程,并且bs4可能未安装在超级用户的PYTHONPATH中的某个位置。要解决此问题,您可以添加EnvironmentVariables键,并在那里设置PYTHONPATH的值。要弄清楚你的PYTHONPATH是什么,你可以运行echo $PYTHONPATH

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.jerry.satimages</string>
        <key>ProgramArguments</key>
        <array>
           <string>python</string>
            <string>/Users/jerrykallam/python_practice/sat_image.py</string>
        </array>
        <!-- ADDED THIS -->
        <key>EnvironmentVariables</key>
        <dict>
            <key>PYTHONPATH</key>
            <string>/your/python/path</string>
        </dict>
        <key>StartInterval</key>
        <integer>360</integer>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>