2015-11-24 12 views
0

Я запускаю следующие импортные питоны в сценарии, который отлично работает из командной строки в терминале и из ноутбука ipython.ImportError: Нет модуля с именем bs4 при вызове из launchd

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

Когда он вызывается из .plist файла через Mac я получаю запуск программ следующее сообщение об ошибке:

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, который работает корректно. Не знаю, почему скрипт не может импортировать bs4 только при вызове launchd.

<?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> 
+1

Вы можете запустить 'Судо пип замораживания | grep beautifulsoup4' и посмотреть, установлен ли пакет для суперпользователя? – wpercy

+0

Я получаю следующее: Каталог «Пользователи/jerrykallam/Library/Caches/pip/http» или его родительский каталог не принадлежит текущему пользователю, и кеш отключен. Проверьте разрешения и владельца этого каталога. Если вы используете pud с sudo, вам может понадобиться флаг sudo -H. beautifulsoup4 == 4.3.2 – cubflier

+0

И каковы разрешения и владелец этого каталога? – wpercy

ответ

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> 
1

Ищите различия в sys.path между CLI и когда он запускается из 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() 

вместо просто "печать sys.path".

В принципе, я предполагаю, что файл .plist запускается до того, как ваша среда unix (ish) будет полностью настроена.

0

Я столкнулся с этой точной проблемой (OS X 10.11.3 El Cap). Добавление PYTHONPATH к EnvironmentVariables не сработало. То, что работа вызывала конкретный путь для python.

Так, в ProgramArguments вместо:

<string>python</string> 

... это:

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