ImportError: No module named bs4 when called from launchd
ImportError: No module named bs4 when called from launchd
我是 运行 以下 python 导入的脚本,该脚本在终端的命令行和 ipython 笔记本中运行良好。
#!/usr/bin/python
import os
import re
import urllib
import urllib2 as ul
import sys
from bs4 import BeautifulSoup as bs
当通过 Mac launchd 从 .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>
寻找 CLI 与 plist 中 运行 之间的 sys.path 差异。如果 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"。
基本上,我猜测在您的 unix(ish) 环境完全设置之前,.plist 文件正在 运行。
这可能是因为 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>
我 运行 解决了这个问题 (OS X 10.11.3 El Cap)。将 PYTHONPATH 添加到 EnvironmentVariables 不起作用。起作用的是调用 python.
的特定路径
因此,在 ProgramArguments 中而不是:
<string>python</string>
...这个:
<string>/your/python/path</string>
我是 运行 以下 python 导入的脚本,该脚本在终端的命令行和 ipython 笔记本中运行良好。
#!/usr/bin/python
import os
import re
import urllib
import urllib2 as ul
import sys
from bs4 import BeautifulSoup as bs
当通过 Mac launchd 从 .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>
寻找 CLI 与 plist 中 运行 之间的 sys.path 差异。如果 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"。
基本上,我猜测在您的 unix(ish) 环境完全设置之前,.plist 文件正在 运行。
这可能是因为 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>
我 运行 解决了这个问题 (OS X 10.11.3 El Cap)。将 PYTHONPATH 添加到 EnvironmentVariables 不起作用。起作用的是调用 python.
的特定路径因此,在 ProgramArguments 中而不是:
<string>python</string>
...这个:
<string>/your/python/path</string>