我正在创建一个bash脚本,该脚本调用一个python脚本,该脚本随后使用subprocess.run()
在bash中运行其他进程。但是,当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.6激活conda环境,确保使用python 3运行脚本,这不会给我调用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脚本和我拥有的import subprocess
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)
我正在python中使用subprocess.run,因为最后,我想在bash中运行该进程后获取run_metric.stdout的字符串,以便稍后将其存储在数组中并保存到txt文件中。
我希望我足够清楚并提供足够的信息。 谢谢!
答案 0 :(得分:0)
收到评论后,我测试了print(subprocess.__file__)
的输出,它显示所使用的python是python2.7,
因此,我将python脚本的调用从python script.py
更改为python3 script.py
。我发现了这个问题,它也显示了从终端调用python程序的另一种方法。