вызов подпроцесса с помощью argparse - PullRequest
0 голосов
/ 18 сентября 2018

Структура каталога папок выглядит следующим образом:

folder_A
folder_A/a.py
folder_A/subfolder_AA/b.py
folder_A/subfolder_AA/subsubfolder_testvideos/a.avi

a.py выглядит так ...

import cv2
import argparse as ap

def run(source=0, dispLoc=False):
    cam=cv2.VideoCapture(source)
    while True:
        ret, img = cam.read()
        if not ret:
            exit()
        if(cv2.waitKey(10)==ord('p')):
            break
        cv2.imshow("image",img)
    cv2.destroyWindow("image")

# Other scripts here....
if __name__ =="__main__":
    parser = ap.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-d', "--deviceID", help="Device ID")
    group.add_argument('-v', "--videoFile", help="Path to Video File")
    parser.add_argument('-l', "--dispLoc", dest="dispLoc", 
    action="store_true")
    args = vars(parser.parse_args())

    if args["videoFile"]:
        source = args["videoFile"]
    else:
        source = int(args["deviceID"])

    run(source, args["dispLoc"])

a.py пытается импортировать и запускать b и bнуждается в argparse.

Если я просто запущу b.py из терминала, команда запуска b будет иметь вид

python b.py -v subsubfolder_testvideos/a.avi

Я пытаюсь запустить a.py и запустить b.pyвнутри него.

В файле a.py я написал следующие коды:

import sys
sys.path.append('~/Desktop/folder_A')
sys.path.append('~/Desktop/')
from os import system
import subprocess

subprocess.call(["python", "b.py","-v testvideos/a.avi"], cwd="/subfolder_AA/", shell=True)

, и ошибка вывода: FileNotFoundError: [Errno 2] Нет такого файла или каталога: '/ subfolder_AA / ':' / subfolder_AA / '

Эта ошибка исходит от моей ошибочной команды, использующей subprocess.call?Как я мог это исправить?

1 Ответ

0 голосов
/ 18 сентября 2018

Во-первых, вы делаете абсолютный путь к файлу, когда префикс папки с /.

Во-вторых, вы должны использовать обычный импорт python вместо вызовов подпроцесса. Вы должны поместить __init__.py в подпапку, чтобы иметь возможность импортировать из нее. Затем вы можете изменить b.py, чтобы он передавал аргументы из ArgumentParser в другую функцию, которая затем импортируется a.py. Что-то вроде:

b.py:

def process_video(device_id=None, video_file=None):
    # ...do stuff...

if __name__ == '__main__':
    parser = ArgumentParser()
    # ...etc...
    return process_video(device_id=parser.deviceid, video_file=parser.videofile)

a.py:

from subfolder_AA.b import process_video

processed_video = process_video(video_file='testvideos/a.avi')
...