pythonのシェバンについてメモ
pythonの保存場所やエイリアスを確認する
ls -al /usr/bin/python* lrwxrwxrwx 1 hoge hoge 9 Apr 16 2018 /usr/bin/python -> python2.7* lrwxrwxrwx 1 hoge hoge 9 Apr 16 2018 /usr/bin/python2 -> python2.7* -rwxr-xr-x 1 hoge hoge 3633560 Apr 16 2018 /usr/bin/python2.7* lrwxrwxrwx 1 hoge hoge 9 Apr 10 2018 /usr/bin/python3 -> python3.6* -rwxr-xr-x 1 hoge hoge 1018 Oct 29 2017 /usr/bin/python3-jsondiff* -rwxr-xr-x 1 hoge hoge 3661 Oct 29 2017 /usr/bin/python3-jsonpatch* -rwxr-xr-x 1 hoge hoge 1342 May 2 2016 /usr/bin/python3-jsonpointer* -rwxr-xr-x 1 hoge hoge 398 Nov 16 2017 /usr/bin/python3-jsonschema* -rwxr-xr-x 2 hoge hoge 4576440 Apr 1 2018 /usr/bin/python3.6* -rwxr-xr-x 2 hoge hoge 4576440 Apr 1 2018 /usr/bin/python3.6m* lrwxrwxrwx 1 hoge hoge 10 Apr 10 2018 /usr/bin/python3m -> python3.6m*
1. python3.6を直に指定するスクリプト
cat shebang_test1.py #!/usr/bin/python3.6 # encoding: utf-8 import sys print(sys.version)
2. pythonを直に指定するスクリプト
cat shebang_test2.py #!/usr/bin/python # encoding: utf-8 import sys print(sys.version)
3. 環境変数からpython3.6を指定するスクリプト
cat shebang_test3.py #!/usr/bin/env python3.6 # encoding: utf-8 import sys print(sys.version)
4. 環境変数からpythonを指定するスクリプト
cat shebang_test4.py #!/usr/bin/env python # encoding: utf-8 import sys print(sys.version)
各スクリプトのシェバン行だけ並べるとこんな感じ
grep "" -n shebang_test* | grep python shebang_test1.py:1:#!/usr/bin/python3.6 shebang_test2.py:1:#!/usr/bin/python shebang_test3.py:1:#!/usr/bin/env python3.6 shebang_test4.py:1:#!/usr/bin/env python
1,2,3,4のコードを実行してみる
chmod 755 shebang_test* ./shebang_test1.py 3.6.5 (default, Apr 1 2018, 05:46:30) [GCC 7.3.0] ./shebang_test2.py 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0] ./shebang_test3.py 3.6.5 (default, Apr 1 2018, 05:46:30) [GCC 7.3.0] ./shebang_test4.py 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0]
activateして、1,2,3,4のコードを実行
. bin/activate.fish (django) ./shebang_test1.py 3.6.5 (default, Apr 10 2018, 17:08:20) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] (django) ./shebang_test2.py 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] (django) ./shebang_test3.py 3.6.5 (default, Apr 10 2018, 17:08:20) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] (django) ./shebang_test4.py 3.6.5 (default, Apr 10 2018, 17:08:20) [GCC 4.4.7 20120313 (Red Hat 4.4.7-18)]
まとめ
venvで仮想環境を用意し、activateした状態で
直にpython3.6を指定すると、思った通りの動作をしないかもしれない。
/usr/bin/env pythonを指定すると、
. ./bin/activate.fishした場合でも、仮想環境内のpythonを呼び出せる。
venvで仮想環境を作成して作業(activate)してるときは、
仮想環境内のpythonを呼び出してほしいはずなので、
シェバンでも/usr/bin/env pythonを指定するようにしていこう。
また、activateした状態で、
/usr/bin/env pip freeze と
/usr/bin/pip freeze を 見比べれば、違いが良く分かる。
(django) hoge@hage ~/project# /usr/bin/env pip freeze Django==2.1.3 pytz==2018.7 (django) hoge@hage ~/project# /usr/bin/pip freeze asn1crypto==0.24.0 cffi==1.11.5 cli-helpers==1.1.0 Click==7.0 configobj==5.0.6 cryptography==2.3.1 greenlet==0.4.14 gunicorn==19.8.1 idna==2.7 lxml==4.2.0 mod-wsgi==4.6.2 msgpack==0.5.6 mycli==1.18.2 parso==0.3.1 prompt-toolkit==2.0.4 pycparser==2.19 Pygments==2.2.0 PyMySQL==0.9.2 redis==2.10.6 setproctitle==1.1.10 six==1.11.0 sqlparse==0.2.4 tabulate==0.8.2 terminaltables==3.1.0 wcwidth==0.1.7
cf. Pythonのcoding: ナントカのことがよく分からないから調べてみた
https://qiita.com/ronin_gw/items/2c82b727461b18991eff
コメント