我正在创建一个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文件中。
我希望我足够清楚并提供足够的信息。谢谢!
收到评论后,我测试了print(subprocess.__file__)
的输出,显示正在使用的python是python2.7,
因此,我将python脚本的调用从python script.py
更改为python3 script.py
。我发现了这个问题,这也显示了从终端调用python程序的另一种方法。