【发布时间】:2019-04-03 15:26:11
【问题描述】:
我正在创建一个 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 文件.
我希望我足够清楚并提供了足够的信息。 谢谢!
【问题讨论】:
-
当前目录下是否有名为
subprocess.py或subprocess.pyc的文件? -
你从中得到了什么输出:
print (subprocess.__file__) -
感谢 cmets!我发现 subprocess.__file__ 正在抛出 python 2 版本,因此 subprocess 将不起作用。如何解决这个问题?
标签: python bash subprocess