質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2369閲覧

Djangoサーバなら動作するのに、MacOS+Apache+mod_wsgiだと"No such file or directory: 'Xvfb'"となってしまう

k-zil

総合スコア16

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/25 10:31

特定のウェブページをスクレイピングする仕組みをDjango+pyvirtualdisplay+seleniumで製作中です。
動作確認環境は、同じMac内に以下の2つがあります。

  1. python manage.py runserverで起動させるDjangoの開発サーバを使っての動作確認(http://127.0.0.1:8000/)
  2. Apache+mod_wsgiで動作確認(http://localhost/)

このそれぞれの環境において、pyvirtualdisplay+seleniumでスクレイピングを行う処理を実行すると、1に方は問題なく動作するのに、2の方だけ以下のエラーとなってしまいます。

EasyProcessCheckInstalledError at /xxxxxxxxxxx cmd=['Xvfb', '-help'] OSError=[Errno 2] No such file or directory: 'Xvfb': 'Xvfb' Program install error!

MacにはXQuartzをインストール済みで、XQuartzを起動してxtermが表示された状態にして処理を実行しています。(処理を実行すると、1の方はFirefoxのウィンドウが起動してスクレイピング対象のウェブページが表示され、その後、Firefoxが終了する様子が見て取れます)
Macのターミナルで「which Xvfb」を実施しても、以下のように表示されるので、Xvfbは問題なくインストールされているものと考えています。

$ which Xvfb /opt/X11/bin/Xvfb

Django開発サーバではXvfbが正しく認識され、Apache+mod_wsgiではXvfbが認識されていないのではないかと思っています。
Apache+mod_wsgiで動作させる場合、Xvfbのパスを認識させる設定などが必要なのでしょうか??
Apache+mod_wsgiとXvfbとのそれぞれの実行ユーザーに関する何らかの設定が必要なのでしょうか??

いろいろとググってみましたが同じような問題にフォーカスした情報が見つけられず万策尽きたため、ここで質問させていただきました。

MacのApache+mod_wsgiでXvfbを動作させて、上記のDjangoエラーメッセージを解消する方法やヒント、切り分け方法など、ご指南いただけると大変助かります。

どうぞよろしくお願い致します。m(_ _)m

該当のソースコード

python

1from pyvirtualdisplay import Display 2from selenium import webdriver 3from selenium.webdriver.firefox.options import Options 4 5#仮想ディスプレイの設定 6display = Display(visible=0, size=(800, 600)) 7display.start() 8 9#webdriverの設定 10geckodriver_path = "/usr/local/bin/geckodriver" 11options = Options() 12options.set_headless(Options.headless) 13 14#selenium webdriverの起動 15driver = webdriver.Firefox(executable_path=geckodriver_path, log_path=settings.WEB_DRIVER_LOG_PATH, options=options)

mod_wsgi

# path # /etc/apache2/other/wsgi.conf LoadModule wsgi_module /Users/hogehoge/code/pyenv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so WSGIScriptAlias / /Users/hogehoge/code/pyenv/my_project/my_project/wsgi.py WSGIPythonPath /Users/hogehoge/code/pyenv/lib/python3.6/site-packages <Directory /Users/hogehoge/code/pyenv/my_project/my_project> Require all granted </Directory>

各種バージョン

  • MacOS : 10.14.6
  • Python : 3.6.5
  • Django : 2.1
  • Apache : 2.4.34
  • mod_wsgi : 4.6.8
  • XQuartz : 2.7.11
  • X : Xorg -versionの実行結果↓
X.Org X Server 1.18.4 Release Date: 2016-07-19 X Protocol Version 11, Revision 0 Build Operating System: Darwin 14.0 x86_64 Current Operating System: Darwin hayashikenichinoMacBook-Pro.local 18.7.0 Darwin Kernel Version 18.7.0: Tue Aug 20 16:57:14 PDT 2019; root:xnu-4903.271.2~2/RELEASE_X86_64 x86_64 Build Date: 25 October 2016 10:12:52PM Current version of pixman: 0.34.0 Before reporting problems, check http://wiki.x.org to make sure that you have the latest version.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決

まず、ビュー(適当なテンプレートビューなど)に以下のコードを追記して、反映されている環境変数PATHの値をそれぞれで確認してみました。

python

1import subprocess 2proc = subprocess.run(["printenv"],stdout = subprocess.PIPE, stderr = subprocess.PIPE) 3context["cmd_result"] = proc.stdout.decode("utf8") #このcontext["cmd_result"]の値をテンプレートで出力してPATHの値を確認

python manage.py runserverで起動した場合、上記の出力結果でPATHを見ると、

PATH=/Users/hogehoge/fugafuga/pyenv/bin:/usr/local/opt/mariadb@10.1/bin:/Users/hogehoge/.pyenv/shims:/Users/hogehoge/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin

となります。ここには、/opt/X11/binのパスがちゃんと含まれています。

一方、Apache+mod_wsgiでウェブサーバを起動(sudo apachectl start)した場合で上記の出力結果を確認すると、PATHは、

PATH=/usr/bin:/bin:/usr/sbin:/sbin

となります。
ここには、/opt/X11/binが含まれていません。つまり、Apache+mod_wsgiでウェブサーバを起動した場合は、/opt/X11/binのパスが通っていないため、No such file or directory: 'Xvfb': 'Xvfb'というエラーになっていたことが分かりました。

では、Apache+mod_wsgiでウェブサーバを起動(sudo apachectl start)する場合に、どうやって/opt/X11/binへのパスを通すか?ですが、いろいろ調べた結果、
/System/Library/LaunchDaemons/org.apache.httpd.plist
のファイルを編集する、ということが分かりました。

これは、以下を参考にしました。
'Configure Apache Path Environment Variable on Mac OSX'
https://gist.github.com/srayhunter/5208619

/System/Library/LaunchDaemons/org.apache.httpd.plist
に追記したのは以下の内容です。

<dict> <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin</string> </dict> </dict>

追記した結果の
/System/Library/LaunchDaemons/org.apache.httpd.plist
の全体の内容は以下のとおりです。

<?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>Disabled</key> <true/> <key>Label</key> <string>org.apache.httpd</string> <key>EnvironmentVariables</key> <dict> <key>XPC_SERVICES_UNAVAILABLE</key> <string>1</string> <key>OBJC_DISABLE_INITIALIZE_FORK_SAFETY</key> <string>YES</string> <key>PATH</key> <string>/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin</string> </dict> <key>ProgramArguments</key> <array> <string>/usr/sbin/httpd-wrapper</string> <string>-D</string> <string>FOREGROUND</string> </array> <key>OnDemand</key> <false/> </dict> </plist>

これで、XQuartzを起動した状態で、sudo apachectl startでApache+mod_wsgiを起動してDjangoを動作させると、質問内容のエラーは出ず、pyvirtualdisplay+seleniumで無事にスクレイピングができるようになりました。

補足

今回の調査中に、sudo apachectl startではなく、httpd -k startでApacheを起動すると、環境変数PATHはpython manage.py runserverで起動したときと同じになり、質問内容のエラーが出ず、今回の問題は解消される、ということに気が付きました。
しかし、Apacheの起動は、httpd -k startで起動するより、sudo apachectl startの起動方法の方が推奨されているようなので、上記の解決方法のとおり、
/System/Library/LaunchDaemons/org.apache.httpd.plist
に希望するPATHを追記するやり方がよいのだと思います。
この点については、Teratailの別質問としてスレッドを立てたので、そちらを参考にしてください。
https://teratail.com/questions/239030

投稿2020/02/26 02:50

k-zil

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問