ホームページ >バックエンド開発 >Python チュートリアル >Python スクリプトを実行するときに実行権限を追加する必要がありますか?

Python スクリプトを実行するときに実行権限を追加する必要がありますか?

王林
王林転載
2023-04-26 18:19:081547ブラウズ

ケース分析

この問題の説明は少し直観に反していますが、ファイルを実行するには実行権限が必要ではないでしょうか?まず例を見てみましょう:

# module1.py
def test():
    print ('hello world!')
 
if __name__ == '__main__':
    test()

これは module1.py という名前のファイルです。このファイルには読み取り権限のみがあります:

[dechin@dechin-manjaro excute ]$ ll
-r--r--r-- 1 dechin dechin 78 1月 15 日 17:06 module1.py

Python を直接使用してこのファイルを実行できます:

[dechin@dechin-manjaro excute]$ python3 module1.py
hello world!

このファイルは、読み取り権限しかない場合でも実行できることがわかりました。厳密に検証するために、ここで別のテストモードを作成し、インポートで Python ファイルをインポートしますが、実行権限は必要ありませんか?

# module2.py
from module1 import test
 
if __name__ == '__main__':
    test()

同様に、新しく作成したファイルには実行権限が与えられていません:

[dechin@dechin-manjaro excute]$ ll
-r--r-- r- - 1 dechin dechin 78 January 15 17:06 module1.py
-r--r--r-- 1 dechin dechin 64 January 15 17:44 module2.py

# # を実行しましょう。 module2.py ファイル:

[dechin@dechin-manjaro excute]$ python3 module2.py

hello world!

これでテストは完了です。通常の py ファイルの実行には実行権限が必要ないことが確認されており、これが権限最小化の制約に一定のインスピレーションを与えています。

原理の説明

stackoverrun に返信があり、作者 cedbeu は次のように説明しています: Python 自体が言語パーサーの役割を引き受けており、py ファイルは単なるテキスト ファイルです。実際に実行されるバイナリ ファイルは、ユーザーが作成した py ファイルではなく python です。したがって、py ファイルの実行権限が削除されても、python を通じて py ファイルを実行できます。ただし、Python の実行権限を削除すると、このタスクを正常に実行できなくなります。

拡張テスト

py ファイルが pyc および pyo 形式のファイルにコンパイルされる場合、この時点でのタスクの実行には実行権限が必要ですか?最初に pyc ファイルをテストします:

[dechin@dechin-manjaro excute]$ python3 -m py_compile module1.py

コンパイルを実行すると、このファイルが見つかります。現在のディレクトリ __pycache__ フォルダー。コンパイルされた pyc ファイルはこのディレクトリに保存されます:

[dechin@dechin-manjaro excute]$tree

.
--------------── module1 .py
§── module2.py
└── __pycache__
└── module1.cpython-38.pyc

1 ディレクトリ、3 ファイル
[dechin@dechin-manjaro excute] $ cd __pycache__/
[dechin@dechin-manjaro __pycache__]$ ll
合計使用量 4
-rw-r--r-- 1 dechin dechin 259 1月15日 18:01 module1. cpython-38. pyc

ここでは、pyc ファイルのファイル名には固定のサフィックスが付いており、実行権限もありません。ここでは、同じコマンドを使用して pyc ファイルを実行します:

[dechin@dechin-manjaro __pycache__]$ ll

-r--r--r-- 1 dechin dechin 259 1月 15 18:01 module1.cpython-38.pyc
- rw -r--r-- 1 デチン デチン 259 1月 15 日 18:13 module1.pyc
-r--r--r-- 1 デチン デチン 64 1 月 15 日 18:09 module2.py
[デチン@ dechin-manjaro __pycache__]$ python3 module1.cpython-38.pyc
hello world!
[dechin@dechin-manjaro __pycache__]$ python3 module2.py
hello world!

ここで、pyc ファイルが直接実行された場合でも、module1.pyc という名前に変更されてから module2.py 経由でインポートされた場合でも、通常どおり実行でき、どちらも実行権限がないことがわかります。次に、pyo ファイルをもう一度試してみましょう:

[dechin@dechin-manjaro excute]$ python3 -O -m py_compile module1.py

opt pyc ファイルで実行:

[dechin@dechin-manjaro __pycache__]$ python3 module1.cpython-38.opt-1.pyc

hello world!

同じ、可能性があります実行権限がなくても正常に実行されます。

技術的なイースターエッグ

pyc ファイルの名前を強制的に py ファイルに変更しても、タスクの実行には影響しません:

[dechin@dechin- manjaro __pycache__] $ cp module1.cpython-38.opt-1.pyc module1.py

[dechin@dechin-manjaro __pycache__]$ ll
合計使用量 20
-rw-r--r-- 1 デチン デチン 259 1 月 15 日 18:17 module1.cpython-38.opt-1.pyc
-r--r--r-- 1 デチン デチン 259 1 月 15 日 18:01 module1.cpython-38.pyc
-rw-r--r-- 1 デチン デチン 259 1 月 15 日 18:20 module1.py
-rw-r--r-- 1 デチン デチン 259 1 月 15 日 18:13 module1.pyc
-r--r--r-- 1 dechin dechin 64 1月 15 日 18:09 module2.py
[dechin@dechin-manjaro __pycache__]$ python3 module1.py
hello world!
#

以上がPython スクリプトを実行するときに実行権限を追加する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。