コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2025年1月11日 >>> 2024年12月29日
link もっと後

2025年1月11日

Pythonの仮想環境はリネームできない

目次: Python

Pythonの仮想環境(venv)は便利ですが、移動したりリネームすると使えなくなる罠があります。変な仕様ですね。

使えなくなる理由はいくつかありますが、そのうちの1つはvenv/binの下にあるPythonスクリプトのshebangにPythonインタプリターの絶対パスが書かれているからです。なぜこんなことになるのかインストーラ(pip)の実装を軽く調べました。

pipの調べ方

調べ方もメモしておきます。実験用のvenv環境を作成します。

Python仮想環境(venv)を作成
$ python -m venv venv
$ source venv/bin/activate

実験するときはwheelパッケージをinstall/uninstallするのが動作も速いしやりやすいです。wheelでなくともbinの下に実行ファイルをインストールするパッケージであれば何でも良いです。ただし例えばsimplejsonパッケージはbinの下に何もインストールしないので今回の調査には適しません。

wheelパッケージのインストール/アンインストール
(venv) $ pip install wheel
(venv) $ pip uninstall -y wheel

あとはpipパッケージのスクリプトにprint文を入れつつinstall/uninstallを繰り返し、スクリプトのどこで何をしているか調べるだけです。

binの下は絶対パスだらけ

Pythonスクリプトのshebangに絶対パスを書く処理は、pipの下記の部分です。

pipがshebangを生成する処理

# venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py

    def _make_script(self, entry, filenames, options=None):
        post_interp = b''
        if options:
            args = options.get('interpreter_args', [])
            if args:
                args = ' %s' % ' '.join(args)
                post_interp = args.encode('utf-8')
        shebang = self._get_shebang('utf-8', post_interp, options=options)    #★★shebangを得る★★
        script = self._get_script_text(entry).encode('utf-8')
        scriptnames = self.get_script_filenames(entry.name)
        if options and options.get('gui', False):
            ext = 'pyw'
        else:
            ext = 'py'
        self._write_script(scriptnames, shebang, script, filenames, ext)    #★★スクリプトをファイルに書き込む★★

...


    def _get_shebang(self, encoding, post_interp=b'', options=None):
        enquote = True
        if self.executable:
            executable = self.executable
            enquote = False  # assume this will be taken care of
        elif not sysconfig.is_python_build():
            executable = get_executable()    #★★インタプリタ実行パスを得る★★
        elif in_venv():  # pragma: no cover
            executable = os.path.join(sysconfig.get_path('scripts'), 'python%s' % sysconfig.get_config_var('EXE'))
        else:  # pragma: no cover
            if os.name == 'nt':
                # for Python builds from source on Windows, no Python executables with
                # a version suffix are created, so we use python.exe
                executable = os.path.join(sysconfig.get_config_var('BINDIR'),
                                          'python%s' % (sysconfig.get_config_var('EXE')))
            else:
                executable = os.path.join(
                    sysconfig.get_config_var('BINDIR'),
                    'python%s%s' % (sysconfig.get_config_var('VERSION'), sysconfig.get_config_var('EXE')))

...


# venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py

def get_executable():
    # The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as
    # changes to the stub launcher mean that sys.executable always points
    # to the stub on OS X
    #    if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__'
    #                                     in os.environ):
    #        result =  os.environ['__PYVENV_LAUNCHER__']
    #    else:
    #        result = sys.executable
    #    return result
    # Avoid normcasing: see issue #143
    # result = os.path.normcase(sys.executable)
    result = sys.executable    #★★実行中のpythonインタープリタの絶対パスを得る★★
    if not isinstance(result, text_type):
        result = fsdecode(result)
    return result

コメントに書いた通り、実行中のPythonインタープリタの絶対パスsys.executableからshebangを生成します。この処理はvenv/bin以下にインストールされるPythonスクリプト全てに適用され、venv/bin以下のスクリプト全てにPythonの絶対パスが書かれるようです。

編集者:すずき(2025/01/13 16:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2025年1月11日 >>> 2024年12月29日
link もっと後

管理用メニュー

link 記事を新規作成

<2025>
<<<01>>>
---1234
567891011
12131415161718
19202122232425
262728293031-

最近のコメント5件

  • link 24年6月17日
    Bobさん (06/04 09:25)
    「BindIPv6Only=no does...」
  • link 18年8月12日
    すずきさん (05/29 16:57)
    「コメントありがとうございます。\n\nこ...」
  • link 18年8月12日
    ARM926EJ-Sさん (05/29 14:27)
    「この記事が書かれたのは2018年ですが、...」
  • link 17年9月3日
    すずきさん (05/26 23:59)
    「>ちょさんさん\nご参考になれば幸いです...」
  • link 17年9月3日
    ちょさんさん (05/26 20:34)
    「自分もこの機種と全く同じCN-SP700...」

最近の記事20件

  • link 20年10月23日
    すずき (05/29 16:53)
    「[ROCK64/ROCKPro64 - まとめリンク] 目次: ROCK64/ROCKPro64[ROCK64] ROCK64ブート...」
  • link 18年8月12日
    すずき (05/29 16:53)
    「[ARM PCで開発できるか?] 目次: ROCK64/ROCKPro64最近のARM搭載SoCはかなり速くなっています。もし...」
  • link 18年12月15日
    すずき (05/29 16:52)
    「[ARMワンボードPCのネットワーク速度] 目次: ROCK64/ROCKPro64Raspberry Pi対抗ボードの多くは...」
  • link 21年5月22日
    すずき (05/29 16:50)
    「[ベンチマーク - まとめリンク] 目次: ベンチマーク一覧が欲しくなったので作りました。USB HDD RAIDのベンチマー...」
  • link 06年5月17日
    すずき (05/29 16:49)
    「[ディスクI/Oベンチマークプログラム] 目次: ベンチマーク研究室のゼミの後に、明日のシス情セミナーの発表練習を行いました。...」
  • link 06年5月15日
    すずき (05/29 16:45)
    「[USB HDD RAIDのベンチマーク] 目次: ベンチマーク昨日作成したRAID0+1の書き込み性能を測定しました。やはり...」
  • link 25年5月24日
    すずき (05/25 22:25)
    「[メガネが壊れた] 金曜日、メガネの鼻当てが曲がってんなー?と思って、元の位置に戻そうと指で押したらパキっと音がして折れました...」
  • link 25年5月25日
    すずき (05/25 21:53)
    「[JTSA Unlimited大会参加2025] 目次: 射的JTSA Unlimitedの大会に参加しました。「木」ステージ...」
  • link 22年3月18日
    すずき (05/25 21:41)
    「[射的 - まとめリンク] 目次: 射的関係の深いまとめリンク。目次: Arduino一覧が欲しくなったので作りました。ガスガ...」
  • link 25年5月9日
    すずき (05/23 23:31)
    「[JavaとM5Stamp C3とBluetooth LE - Bluetoothデバイスとの通信改善] 目次: Arduin...」
  • link 23年6月2日
    すずき (05/23 23:31)
    「[Arduino - まとめリンク] 目次: Arduino関係の深いまとめリンク。目次: 射的一覧が欲しくなったので作りまし...」
  • link 23年4月10日
    すずき (05/23 22:59)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年4月25日
    すずき (05/23 22:59)
    「[ImageMagickでAVIFを変換] 目次: LinuxAVIFが読めないアプリケーションがたまにあるので、AVIF(A...」
  • link 25年5月23日
    すずき (05/23 22:30)
    「[デバッグ用のlibcを使って実行する方法(ダイナミックリンク編)] 目次: C言語とlibcCライブラリのデバッグをしたいと...」
  • link 22年4月13日
    すずき (05/23 22:30)
    「[C言語とlibc - まとめリンク] 目次: C言語とlibcC言語について。プログラムの落とし穴、演算子の優先順位標準入力...」
  • link 25年5月22日
    すずき (05/23 22:21)
    「[デバッグ用のlibcを使って実行する方法(スタティックリンク編)] 目次: C言語とlibcCライブラリのデバッグをしたいと...」
  • link 25年5月20日
    すずき (05/23 03:18)
    「[glibcのsigprocmask()とpthread_sigmask()の実装] 目次: C言語とlibc以前、シグナルマ...」
  • link 23年6月1日
    すずき (05/23 00:38)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 25年5月16日
    すずき (05/23 00:37)
    「[フォントがおかしいので直した] 目次: 自宅サーバーこのブログ、フォント設定が2つほどおかしかったので直しました。今まで見づ...」
  • link 23年5月15日
    すずき (05/22 00:23)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www2.katsuster.net
RDFファイル RSS 1.0

最終更新: 06/04 09:25