ImportError: нет модуля с именем bs4 при вызове из launchd

Я запускаю следующий импорт python в скрипте, который отлично работает из командной строки в терминале и из записной книжки ipython.

#!/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> 

person cubflier    schedule 24.11.2015    source источник
comment
Можете ли вы запустить sudo pip freeze | grep beautifulsoup4 и посмотреть, установлен ли пакет для суперпользователя?   -  person wpercy    schedule 25.11.2015
comment
Я получаю следующее: Каталог «/Users/jerrykallam/Library/Caches/pip/http» или его родительский каталог не принадлежит текущему пользователю, и кеш отключен. Пожалуйста, проверьте разрешения и владельца этого каталога. Если вы выполняете pip с помощью sudo, вам может понадобиться флаг sudo -H. красивыйсуп4==4.3.2   -  person cubflier    schedule 25.11.2015
comment
И каковы разрешения и владелец этого каталога?   -  person wpercy    schedule 25.11.2015
comment
Когда я запускаю sudo -H pip freeze | grep beautifulsoup4, я получаю: beautifulsoup4==4.3.2   -  person cubflier    schedule 25.11.2015
comment
Права доступа: drwx------ 4 jerrykallam staff 136 Oct 26 14:53 http   -  person cubflier    schedule 25.11.2015
comment
Когда я запускаю «echo $PYTHONPATH», ничего не возвращается, поэтому я думаю, что путь не задан.   -  person cubflier    schedule 25.11.2015


Ответы (3)


Вероятно, это связано с тем, что 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> 
person wpercy    schedule 24.11.2015

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

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

   <string>python</string>

... это:

   <string>/your/python/path</string>
person wij    schedule 14.03.2016

Ищите различия в 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) будет полностью настроена.

person Petro    schedule 24.11.2015