Как решить 'AttributeError: объект' модуля 'не имеет атрибута' run '' из subprocess.run () - PullRequest
1 голос
/ 03 апреля 2019

Я создаю сценарий bash, который вызывает сценарий python, который, в свою очередь, запускает другие процессы в bash, используя subprocess.run(). Однако, когда bash-скрипт запускает внутри него скрипт python, в строке, где вызывается subprocess.run, я получаю сообщение об ошибке:

    run_metric = subprocess.run(command, shell=True, stdout = subprocess.PIPE, universal_newlines = True)
AttributeError: 'module' object has no attribute 'run'

1) Я удостоверился, что запустил скрипт, используя python 3, активировав среду conda с python = 3.6, что не должно вызывать никаких проблем при вызове subprocess.run. Интересно то, что если я изменю subprocess.run () на subprocess.Popen (), скрипт будет работать, но я не смог понять, как правильно получить run_metric.stdout.

2) У меня нет файла subprocess.py в каталоге, в котором я работаю

3) результат print(subprocess.__file__) показывает мне, что python не 3,6: /usr/lib/python2.7/subprocess.pyc

Кроме того, я пытался использовать что-то вроде from subprocess import run и убедившись, что в скрипте Python и в функции, которую я имел

Сценарий bash выглядит следующим образом:

SWC_FOLDER_PATH=$(pwd)

sudo chmod +x /media/leandroscholz/KINGSTON/Results_article/Tracing_data/run_metrics.py 

echo "run /media/leandroscholz/Tracing_data/run_metrics.py ${SWC_FOLDER_PATH} /media/leandroscholz/KINGSTON/Results_article/TREEStoolbox_tree_fixed.swc"
python /media/leandroscholz/Tracing_data/run_metrics.py ${SWC_FOLDER_PATH} /media/leandroscholz/TREEStoolbox_tree_fixed.swc

И скрипт Python, который я запускаю, вызывает определенную функцию, которая использует subprocess.run() таким образом (только часть кода, где возникает проблема):

import subprocess 
import glob

import numpy as np

def compute_metrics(swc_folder_path, gt_file_path):

    # first get list of files in swc_folder_path 
    swc_files = (glob.glob(swc_folder_path+"/*_fixed.swc"))
    n_swc_files = len(swc_files)

    workflow_dict = gets_workflow_dict(swc_files)
    n_images = get_n_images(swc_files)
    n_workflows = len(workflow_dict)

    for swc in range(0,n_swc_files):

        command = "java -jar /home/leandroscholz/DiademMetric.jar -G " + swc_files[swc] +" -T " + gt_file_path
        run_metric = subprocess.run(command, shell=True, stdout = subprocess.PIPE, universal_newlines = True)

Я использую subprocess.run в Python, потому что, в конце концов, я хочу получить строку run_metric.stdout после запуска процесса в bash, чтобы потом я мог сохранить его в массиве и сохранить в текстовом файле. ,

Надеюсь, я был достаточно ясен и предоставил достаточно информации. Спасибо!

1 Ответ

0 голосов
/ 04 апреля 2019

После получения комментариев я протестировал вывод print(subprocess.__file__), который показал, что используемый python был python2.7,

Таким образом, я изменил вызов скрипта python с python script.py на python3 script.py.Я нашел этот вопрос, который также показывает другой способ вызова программ на Python из терминала.

Запуск файла Python в терминале

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...