23837


python初心者なので、見当違いの事を言ってましたら、ご指摘ください。  
ここ一週間、ずっと悩んでまして、どなたかヒントだけでも頂けると助かります。

現在の環境

[code]

    # /usr/bin/python -V
    Python 3.5.1
    
    # /usr/local/pyenv/shims/pip3 list
    pip (8.1.1)
    PyMySQL (0.7.2)
    setuptools (18.2)
    
[/code]

作ったプログラム

[code]

    test2.py
    
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import pymysql.cursors
    
[/code]

を

[code]

    /usr/bin/python test2.py
    
[/code]

とすると、エラーは起こらないのですが、

Apache経由のブラウザからアクセスすると、Internal Server Errorとなってしまい、  
Apacheのエラーログに以下が出力されます。

[code]

      File "/var/www/python.hogehoge.com/public_html/test2.py", line 3, in <module>
        import pymysql.cursors
    ImportError: No module named 'pymysql'
    Premature end of script headers: test2.py
    Traceback (most recent call last):, referer: http://python.hogehoge.com/test2.py
      File "/var/www/python.hogehoge.com/public_html/test2.py", line 3, in <module>, referer: http://python.hogehoge.com/test2.py
        import pymysql.cursors, referer: http://python.hogehoge.com/test2.py
    ImportError: No module named 'pymysql', referer: http://python.hogehoge.com/test2.py
    Premature end of script headers: test2.py, referer: http://python.hogehoge.com/test2.py
    
[/code]

※上記は日付等のエラーログのヘッダー部分は消してあります。  
全て、[Thu Apr 07 19:53:54 2016] [error] [client 111.111.11.11]が先頭についています。

サーバー環境はさくらインターネットのVPSで、Apacheはvirtualhostをいくつか切っていて、その一つに置いています。  
お手数ですが、よろしくお願い致します。

2016/04/08 02:29 追記

apacheの設定で、

[code]

    <Directory "/var/www/＊＊＊＊＊＊＊/public_html/">
        Options +ExecCGI
        AddHandler cgi-script .py
    </Directory>
    
[/code]

として、CGIとして動かしているという事を言いたかったのです。＞Apache経由

[code]

    # which httpd
    /usr/sbin/httpd
    # ps auxw | grep /usr/sbin/httpd
    root     20000  0.0  0.0 100004   912 pts/1    S+   02:23   0:00 grep /usr/sbin/httpd
    
[/code]

apacheはrootで動かしてます。


CC BY-SA 3.0
2016-04-07T11:10:30.223
23824
2016-04-09T07:02:16.303
2016-04-08T05:17:03.900
3054
15078
question
python centos apache
CGIとして実行するとImportErrorで動かないPythonスクリプト


ある実行方法では動くのに、別の実行方法では動かない場合はそもそも実行されているPythonが異なっている事があります。  
対象のスクリプトに自身を実行しているPythonについての情報を出力させるには例えば以下のようにします。

[code]

    import sys, os
    print("sys.executable: ", sys.executable)
    print("executable_link: ", os.readlink(sys.executable))
    print("sys.path: ", sys.path)
    print("sys.version_info: ", sys.version_info)
    print("sys.api_version: ", sys.api_version)
    
    import sysconfig
    for p in sysconfig.get_path_names():
        print("sysconfig:path:" + p + ": " + sysconfig.get_path(p))
    
[/code]

同じPythonで実行されていても、モジュールの検索パスが異なっている事もあります。  
質問者の例だと`import`に失敗しているので、`sys.path`が異なっているのではないでしょうか。

`import`は成功しても、意図していないモジュールが読み込まれている事もあります。  
その場合、moduleオブジェクトの`__path__`や`__file__`でいったいどこから読み込まれているのか調べます。

[code]

    # PILモジュールの例
    # ビルトインのモジュールは __path__ や __file__ を持っていません
    import PIL
    print(PIL.__path__, PIL.__file__, PIL.__package__, PIL.__loader__)
    
[/code]


CC BY-SA 3.0
2016-04-08T05:39:00.727
23837
2016-04-08T05:39:00.727
3054
23824
answer


色々やっていてpython3を複数インストールしてしまっていました。  
具体的には、wgetで取ってきたものと、pyenvで入れたものが二つ存在してしまっていたので、pyenvの方をアンインストールして、/usr/bin/に残したp‌​ython本体へのシンボリックリンクを張る事で、動作しました。

[code]

    ln -s /usr/local/python/bin/python3 /usr/bin/python
    
[/code]


CC BY-SA 3.0
2016-04-09T07:02:16.303
23868
2016-04-09T07:02:16.303
15078
23824
answer