web-dev-qa-db-ja.com

python argparserを使用するモジュールの呼び出し

これはおそらくばかげた質問ですが、私はpythonスクリプトを持っており、現在はargparserを使用して一連の引数を取り込んでおり、このスクリプトを別のpythonスクリプト、これは問題ありませんが、関数が定義されていないため、モジュールを呼び出す方法がわかりません。cmdから呼び出した場合と同じように呼び出すことはできますか?

子スクリプトは次のとおりです。

import argparse as ap
from subprocess import Popen, PIPE

parser = ap.ArgumentParser(
    description='Gathers parameters.')
parser.add_argument('-f', metavar='--file', type=ap.FileType('r'), action='store', dest='file',
                    required=True, help='Path to json parameter file')
parser.add_argument('-t', metavar='--type', type=str, action='store', dest='type',
                    required=True, help='Type of parameter file.')
parser.add_argument('-g', metavar='--group', type=str, action='store', dest='group',
                    required=False, help='Group to apply parameters to')
# Gather the provided arguements as an array.
args = parser.parse_args()

... Do stuff in the script

これが、子スクリプトを呼び出す親スクリプトです。また、argパーサーを使用し、他のロジックを実行します

from configuration import parameterscript as paramscript

# Can I do something like this?
paramscript('parameters/test.params.json', test)

構成ディレクトリ内に、空のinit。pyファイルも作成しました。

15

parse_argsの最初の引数は、引数のリストです。デフォルトではNoneです。これは、sys.argvを使用することを意味します。したがって、スクリプトを次のように配置できます。

import argparse as ap

def main(raw_args=None):
    parser = ap.ArgumentParser(
        description='Gathers parameters.')
    parser.add_argument('-f', metavar='--file', type=ap.FileType('r'), action='store', dest='file',
                        required=True, help='Path to json parameter file')
    parser.add_argument('-t', metavar='--type', type=str, action='store', dest='type',
                        required=True, help='Type of parameter file.')
    parser.add_argument('-g', metavar='--group', type=str, action='store', dest='group',
                        required=False, help='Group to apply parameters to')
    # Gather the provided arguements as an array.
    args = parser.parse_args(raw_args)
    print(vars(args))


# Run with command line arguments precisely when called directly
# (rather than when imported)
if __name__ == '__main__':
    main()

そして他の場所:

from first_module import main

main(['-f', '/etc/hosts', '-t', 'json'])

出力:

{'group': None, 'file': <_io.TextIOWrapper name='/etc/hosts' mode='r' encoding='UTF-8'>, 'type': 'json'}
19
Alex Hall

これを行うためのより簡単でよりPythonicな方法があるかもしれませんが、サブプロセスモジュールを使用する1つの可能性があります:

例:

child_script.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-n", "--name", help="your name")
args = parser.parse_args()

print("hello there {}").format(args.name)

次に、別のPythonスクリプトは、次のようにそのスクリプトを呼び出すことができます。

calling_script.py:

import subprocess

# using Popen may suit better here depending on how you want to deal
# with the output of the child_script.
subprocess.call(["python", "child_script.py", "-n", "Donny"])

上記のスクリプトを実行すると、次の出力が得られます。

"hello there Donny"
3
Totem

オプションの1つは、以下のようにサブプロセス呼び出しとして呼び出すことです。

import subprocess
childproc = subprocess.Popen('python childscript.py -file yourjsonfile')
op, oe = childproc.communicate()
print op
2
be_good_do_good