Python3のシェバンについて

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

コメント

タイトルとURLをコピーしました