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

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

ただいまの
回答率

88.92%

Python の sqlite3 モジュールが root 権限での実行時に想定したものが指定されません。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 248

nerianighthawk

score 509

前提・実現したいこと

python の sqlite3 モジュールを使った django プロジェクトを root 権限で実行したいです。
django プロジェクトでは、sqlite3 のバージョンが 3.8.3 以上じゃないと実行できず、sqlite3 のバージョンは 3.27.1 なのにもかかわらず、root 権限で実行した際のモジュールが持つバージョンは 3.7.17 が指定されます。

ルート権限で実行した際のpythonコマンドのsqlite3モジュールはどこのsqlite3を見ているのでしょうか?
モジュールのパス等も調べましたが、よくわかりませんでした。よろしくお願いします。

発生している問題・エラーメッセージ

django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

該当のソースコード

$ python3
Python 3.7.6 (default, Feb 26 2020, 20:54:15) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.27.1'
>>> exit()

$ sudo python3
Python 3.7.6 (default, Feb 26 2020, 20:54:15) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.7.17'
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()

試したこと

$ sudo python3
Python 3.7.6 (default, Feb 26 2020, 20:54:15) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib64/python37.zip', '/usr/lib64/python3.7', '/usr/lib64/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages', '/usr/lib64/python3.7/site-packages', '/usr/lib/python3.7/site-packages']
>>> exit()

補足情報(FW/ツールのバージョンなど)

$ sudo find / -name sqlite3
/usr/bin/sqlite3               #3.27.1
/usr/lib64/python3.7/sqlite3   #ディレクトリ
/usr/lib64/python2.7/sqlite3   #ディレクトリ
/usr/local/bin/sqlite3         #3.27.1

7/15 追記

追記依頼をいただき、ありがとうございます。追記いたします。

管理者権限で実行しなかった際の sys.path は以下の通りです。

$ python3
Python 3.7.6 (default, Feb 26 2020, 20:54:15) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib64/python37.zip', '/usr/lib64/python3.7', '/usr/lib64/python3.7/lib-dynload', '/home/{ユーザ名}/.local/lib/python3.7/site-packages', '/usr/local/lib/python3.7/site-packages', '/usr/lib64/python3.7/site-packages', '/usr/lib/python3.7/site-packages']


実行されている python3 は以下の通りです。

$ which python3
/usr/bin/python3
$ sudo which python3
/bin/python3
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • quickquip

    2020/07/14 22:26

    sudoを付けない時のpythonのsys.pathはどうなっているんでしょう

    キャンセル

  • bsdfan

    2020/07/15 09:34 編集

    pyenvとかの環境を利用されているのでは?
    sudoを使うとユーザ設定の環境変数はクリアされるので、システムのpython3が起動します。
    $ which python3
    $ sudo which python3
    を比べてみてください。

    キャンセル

  • nerianighthawk

    2020/07/15 11:31 編集

    追記依頼ありがとうございます。

    利用されている python3 が違うことは理解しているのですが、sqlite3 の 3.7.17 のバージョンは環境には存在しないはずで、sudo 実行時の sqlite3 のライブラリがどの sqlite3 を参照しているのが不明な状態です。
    よろしくお願いします。

    キャンセル

回答 2

checkベストアンサー

+1

ただ「解決した方法」に、

共有ライブラリへのパスの通し方について、「/etc/ld.so.conf」へ記述する方法にしたら解決できました。
【記述内容】
export LD_LIBRARY_PATH=/usr/local/bin:$LD_LIBRARY_PATH

と書かれてますが、「/etc/ld.so.conf」にはパスのみを書くのが正しいようです。

あと、最近のlinuxディストリビューションだと、「/etc/ld.so.conf」は直接いじらずに、「/etc/ld.so.conf.d」ディレクトリ以下にファイルを作って、そちらに記述するのが流儀のようです。

上記はCentOS7ですが、自分が使っているubuntu20.04もそのようになっています。
Redhatは知りませんが、もしそのようなディレクトリがあればそのようにした方がいいでしょう。


本当は、「pythonを新しいバージョンのsqliteのライブラリをリンクするように再ビルドする」が正しい直し方だと思いますが、まぁそれはそれで大変そうなので、上記を試してみてはいかがですか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 19:24

    回答いただき、ありがとうございます。

    しかし、提示いただいた情報では解決できませんでした。
    やったこととしては、 `/etc/ld.conf.d/sqlite3.conf`ファイルを作成し、`/usr/local/bin`と記載した後、
    ```
    $ sudo ldconfig
    ```
    を実行しました。

    現象としては質問内容の状況と変化がありません。
    何か、思い当たることはありますでしょうか。よろしくお願いします。

    キャンセル

  • 2020/07/15 20:20

    root権限のwhichコマンドで/bin/python3が出るのは間違いないですか?
    もし間違いないというのであれば、「rpm -qf /bin/python3」を実行してみて、どのパッケージがインストールしたか調べてみてください。(Redhatはしばらく触ってないので、間違ってなければいいのだけど)

    あと、sqlite3とpythonはご自身でインストールしましたか?
    (修正依頼にも書かれているとおり、pyenvなども使ってませんか?)
    もしインストールしたならば、その事も質問に追記された方がいいと思います。
    (してない場合でも、「してない」とハッキリ書いた方が、問題の切り分けになります)

    キャンセル

  • 2020/07/17 08:54 編集

    質問内容が説明足らずで申し訳ありません。
    pyenv等は使っていませんが、sqlite3は自分でインストールしたものでした。
    したがって、ライブラリのパス指定をsqlite3 インストール時の.libを指定することで解決しました。
    方法はほぼkatsukoさんのおっしゃる通りでした。ありがとうございました。

    キャンセル

+1

sudo python3


でREPLを起動して、

import _sqlite3
print(_sqlite3.__file__)

すると拡張子soのファイルが表示されるのではないかと思うのでシェルに戻って

ldd そのsoファイル


とすると
libsqlite3.so.0あたりに紐付いているファイルのフルパスが見えると思います。それが"そのPyhton"が使うsqlite3の共有ライブラリです。

これはコンパイル時に決定されて、以降は依存性を変更できないんじゃないかと思います。(未調査)


参考
https://docs.python.org/ja/3/reference/import.html#file

import sqlite3
print(sqlite3.__file__)


とするとモジュールsqlite3のファイル(パッケージなので__init__.pyでしょう)が見えます。

そのファイルからコードをたどっていくと(MacやUbuntuだと)_sqlite3というパッケージが実体だろうと当たりがつきます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 19:30

    回答いただきありがとうございます。

    頂いた情報通り、REPLにて管理者権限実行時と通常実行時それぞれ下記を実行しました。
    ```
    >>> print(_sqlite3.__file__)
    /usr/lib64/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
    ```
    上記、管理者権限実行時と通常実行時に変化がありませんでした。
    こちらの意味するところは同じsqlite3が実行されているということなのでしょうか?

    キャンセル

  • 2020/07/15 20:13

    だとしたら
    ldd /usr/lib64/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so

    sudo ldd /usr/lib64/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
    の結果が違うのではないでしょうか

    キャンセル

  • 2020/07/17 08:59

    ありがとうございます。また、質問内容が説明足らずで申し訳ありません。
    sqlite3 は自分でインストールしたものだったため、インストール時の.libをパス指定することで解決しました。
    ライブラリのパスが悪い時に何を確認すればいいのか等全く知らなかったため、quiquiさんの回答はとても参考になりました。
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る