質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

649閲覧

pythonスクリプトから別のpythonスクリプトを実行したい。

teityura

総合スコア84

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/07/07 16:02

a.pyからb.pyを利用する際、
a.pyにて
import bして、
b.method()のように利用するのが一般的だと思いますが、
b.main()を利用したいです。

しかし、b.pyを単体で利用することもあるため、
b.py arg-a arg-b arg-c のように呼び出したいです。
argparseを利用しており、引数を解析もしたいです。
どういう風に分割するのが一般的なのでしょうか。

具体的には、
enter_excelというファイルが下記のようにあり、
execやsubprocess を使って、
exec('enter_excel 山田太郎 シート名 11:00 16:30')
とした場合、結果や値の受け渡しが面倒になりそうなので、
import enter_excel
enter_excel.main()
としたいのですが、enter_excel単体で利用する場合もあり、
main()で引数を取るのも少し抵抗があります。

今は、仕方ないので、
eman = enter_excel.ExcelManager()
eman.edit_book(FPATH_XLSX, 'シート名', enter_excel.WRITER_DICT[dic["sender"]],
dic["start"], dic["end"], dic["name_kanj"], dic["name_kana"], dic["company"], dic["tel"], )
としていますが、ExcelManagerに渡す前に、
dic["start"], dic["end"]を
ArgsManager.valid_dateでチェックしておきたいのです。

a.py b.py があり、
a.pyからb.pyを利用する際、
どういう風に分割するのが一般的なのでしょうか。
分かりづらい質問ですみませんが、よろしくお願いします。

python3

1# enter_excel.py 2import argparse 3from datetime import datetime 4import openpyxl 5 6FILE_PATH = r'C:\hoge\piyo\enter.xlsx' 7 8WRITER_DICT = { 9 '山田 太郎': ['田中株式会社', '山田 太郎', '03-1111-0001', 'yamada@hoge.com'], 10 '山田 次郎': ['田中株式会社', '山田 次郎', '03-2222-0002', 'yamada@hoge.com'], 11 '山田 三郎': ['田中株式会社', '山田 三郎', '03-3333-0003', 'yamada@hoge.com'], 12 '山田 四朗': ['田中株式会社', '山田 四朗', '03-4444-0004', 'yamada@hoge.com'], 13} 14 15 16# ============================================================================== 17# Parse Args 18# ============================================================================== 19class ArgsManager: 20 def __init__(self): 21 pass 22 23 def valid_date(self, s): 24 try: 25 datetime.strptime(s, "%Y/%m/%d %H:%M") 26 return s 27 except ValueError: 28 msg = f"Not a valid date: '{s}'" 29 raise argparse.ArgumentTypeError(msg) 30 31 def getargs(self): 32 parser = argparse.ArgumentParser( 33 prog='enter_excel.py', 34 usage=r''' 35 ex: 36 enter_excel.py '2019/07/01 11:00' '2019/07/07 13:00' 37 ''', 38 add_help=True, 39 ) 40 parser.add_argument('sender', type=str, help='start') 41 parser.add_argument('start', type=self.valid_date, help='start') 42 parser.add_argument('end', type=self.valid_date, help='end') 43 parser.add_argument('name_kanj', type=str, help='name_kanj') 44 parser.add_argument('name_kana', type=str, help='name_kana') 45 parser.add_argument('company', type=str, help='company') 46 parser.add_argument('tel', type=str, help='tel') 47 args = parser.parse_args() 48 49 # return vars(args) # 辞書で返す 50 return args 51 52 53# ============================================================================== 54# Edit Excel 55# ============================================================================== 56class ExcelManager: 57 def __init__(self): 58 pass 59 60 def edit_book(self, file_path, sheet_name, sender, start, end, name_kanj, name_kana, company, tel): 61 wkbook = openpyxl.load_workbook(file_path) # ブックを取得 62 wksheet = wkbook[sheet_name] # シートを取得 63 self.write_sender(wksheet, sender[0], sender[1], sender[2], sender[3]) # シート編集(記入者) 64 self.write_date(wksheet, start, end) # シート編集(入場予定時刻) 65 self.write_human(wksheet, name_kanj, name_kana, company, tel) # シート編集(入場予定者) 66 wkbook.save(file_path) # 保存する 67 68 def write_sender(self, sheet, company, name_kanj, tel, mail): 69 # E15(山田株式会社) O15(山田太郎) E16(050-5555-5555) O16(yamada@yamada.com) 70 sheet['E15'] = company 71 sheet['O15'] = name_kanj 72 sheet['E16'] = tel 73 sheet['O16'] = mail 74 75 def write_date(self, sheet, start="1999/01/01 00:00", end="2211/11/11 22:22"): 76 start = datetime.strptime(start, '%Y/%m/%d %H:%M') 77 end = datetime.strptime(end, '%Y/%m/%d %H:%M') 78 # E(2019)年 H(6)月 J(1)日 M(13)時 O(30)分 ~ R(17)時 T(30)分 79 sheet['E19'] = str(start.year) 80 sheet['H19'] = str(start.month) 81 sheet['J19'] = str(start.day) 82 sheet['M19'] = str(start.hour) 83 sheet['O19'] = str(start.minute) 84 sheet['R19'] = str(end.hour) 85 sheet['T19'] = str(end.minute) 86 87 def write_human(self, sheet, name_kanj='山田 太郎', name_kana='やまだ たろう', company='山田株式会社', tel='050-5555-5555'): 88 # C(山田 太郎) G(やまだ たろう) K(山田株式会社) R(050-5555-5555) 89 sheet['C23'] = name_kanj 90 sheet['G23'] = name_kana 91 sheet['K23'] = company 92 sheet['R23'] = tel 93 94 95# ============================================================================== 96# main 97# ============================================================================== 98def main(): 99 # 引数解析 100 aman = ArgsManager() 101 args = aman.getargs() 102 103 # Excel編集 104 eman = ExcelManager() 105 eman.edit_book(FILE_PATH, '入場申請書', WRITER_DICT[args.sender], 106 args.start, args.end, args.name_kanj, args.name_kana, args.company, args.tel) 107 108 109if __name__ == "__main__": 110 main()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

単体実行用のmain(コマンドライン引数の解析などを行う)と、内部的に使うmain(必要な情報は関数の引数として取る前提。単体実行用のmainからも、bをimportしたスクリプトからも呼び出される可能性がある)を分けてあげてください。
(それぞれ適切な関数名にして)

python

1# b.py 2# ... 3 4def 単体実行用main(): 5 コマンドライン引数の解釈とかいろいろ 6 内部用main(解釈した情報とかを引数で渡す) 7 8def 内部使用するmain(引数いろいろ): 9 ほげほげ 10 11if __name__ == "__main__": 12 単体実行用main()

python

1# a.py 2import b 3 4# ... 5b.内部使用するmain(必要な情報) 6

投稿2019/07/07 18:53

編集2019/07/07 18:55
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

(前の方が回答されているのに加え)
他の手段としては、

Pythonからコマンドを実行するためのモジュールである、
subprocessモジュールが、使いやすいのでないでしょうか。

投稿2019/07/07 19:44

0kcal

総合スコア275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

b.py が直接実行されるときは以下の if の内容が実行されます。

python

1if __name__ == "__main__": 2 main()

a.py から import した場合は呼び出されません。
これを使って処理を切り分けてみてください。

投稿2019/07/07 18:50

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問