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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

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

Q&A

解決済

2回答

2151閲覧

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

nerianighthawk

総合スコア544

Django

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

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

0グッド

0クリップ

投稿2020/07/14 12:05

編集2020/07/15 02:25

前提・実現したいこと

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

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

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

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

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

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

quickquip

2020/07/14 13:26

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

2020/07/15 00:34 編集

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

2020/07/15 02:31 編集

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

回答2

0

shell

1sudo python3

でREPLを起動して、

python

1import _sqlite3 2print(_sqlite3.__file__)

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

shell

1ldd そのsoファイル

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

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


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

python

1import sqlite3 2print(sqlite3.__file__)

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

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

投稿2020/07/15 07:37

編集2020/07/15 07:44
quickquip

総合スコア11235

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

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

nerianighthawk

2020/07/15 10:30

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

2020/07/15 11: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 の結果が違うのではないでしょうか
nerianighthawk

2020/07/16 23:59

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

0

ベストアンサー

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

共有ライブラリへのパスの通し方について、「/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/14 21:36

katsuko

総合スコア3538

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

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

nerianighthawk

2020/07/15 10:24

回答いただき、ありがとうございます。 しかし、提示いただいた情報では解決できませんでした。 やったこととしては、 `/etc/ld.conf.d/sqlite3.conf`ファイルを作成し、`/usr/local/bin`と記載した後、 ``` $ sudo ldconfig ``` を実行しました。 現象としては質問内容の状況と変化がありません。 何か、思い当たることはありますでしょうか。よろしくお願いします。
katsuko

2020/07/15 11:20

root権限のwhichコマンドで/bin/python3が出るのは間違いないですか? もし間違いないというのであれば、「rpm -qf /bin/python3」を実行してみて、どのパッケージがインストールしたか調べてみてください。(Redhatはしばらく触ってないので、間違ってなければいいのだけど) あと、sqlite3とpythonはご自身でインストールしましたか? (修正依頼にも書かれているとおり、pyenvなども使ってませんか?) もしインストールしたならば、その事も質問に追記された方がいいと思います。 (してない場合でも、「してない」とハッキリ書いた方が、問題の切り分けになります)
nerianighthawk

2020/07/16 23:55 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問