web-dev-qa-db-ja.com

Python-外部を呼び出す方法pythonプログラム?

これは宿題だと言って前置きします。正しい方向に向けられるように、コードを書かないでください。

私たちは自分の選んだプロジェクトに取り組むことができるので、これまでに書いたすべてのミニポートフォリオになるプログラムに取り組んでいます。そこで、ユーザーがプログラムの名前(特定のリストから選択したもの)を入力して、選択したプログラムを既存のシェル内で実行するプログラムを作成します。

しかし、外部プログラムを呼び出す方法に関する情報は本当に見つかりません。誰かが私を正しい方向に向けることができますか?正しいコードを実行するためにifループの束を含む1つの長いプログラムにすべてのコードを配置することを検討しましたが、それよりも複雑なBITにしたいと考えています。

24

それぞれをPythonスクリプトとして呼び出す場合は、次のようにすることができます

_import subprocess
subprocess.call(["python", "myscript.py"])
subprocess.call(["python", "myscript2.py"])
_

しかし、より良い方法は、次のように、他のスクリプトで記述した関数を呼び出すことです。

_import myscript
import myscript2

myscript.function_from_script1()
myscript2.function_from_script2()
_

function_from_script1()などは、myscript.pyファイルとmyscript2.pyファイルで定義されています。詳細については、このページの modules を参照してください。

35
David Robinson

subprocess のドキュメントをご覧ください。

5
Nick Bastin

また、追加の引数を渡す必要がある場合は、次のようにします。

import subprocess
subprocess.call(["python", "myscript.py", "arg1", "arg2", "argN"])
2
Max

外部のPython=ファイルをロードし、モジュールを扱う負担なしに現在のインタープリター内で実行したい場合は、標準の importlib.util モジュールを使用できます。

これは、デモンストレーション用にいくつかのPythonスクリプトを出荷する必要があるが、それらを(サブ)モジュールの一部にしたくはないが、実行は可能である場合に便利です。自動的に、統合テスト中と同じように、ここに例があります:

# A sample Python script
sh$ cat snippet/demo.py 
SOME_MODULE_GLOBAL=True
print("Hello, here is the demo snippet!")
# There is no `__init__.py in the _snippet_ directory
sh$ cat snippet/__init__.py
cat: snippet/__init__.py: No such file or directory

importlib.utilを使用すると、モジュールの一部でなくてもdemo.pyをロードできます。

>>> import importlib.util

# Bypass the standard import machinery to manually load a Python script from
# a filepath
>>> spec = importlib.util.spec_from_file_location('demo','snippet/demo.py')
>>> spec
ModuleSpec(name='demo', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7fa549344eb8>, Origin='snippet/demo.py')
>>> module = importlib.util.module_from_spec(spec)
>>> module
<module 'demo' from 'snippet/demo.py'>

# The next command will run the module:
>>> spec.loader.exec_module(module)
Hello, here is the demo snippet!

# Module variables are accessible just like if it was a
# _normally_ imported module:
>>> module.SOME_MODULE_GLOBAL
True
1
Sylvain Leroux