Error in subprocess.run( ) in Python 3.7.2

Asked

Viewed 562 times

1

I’m using:

  • Windows 10
  • Python 3.7.2 Shell (default IDLE) x64

I’m trying to follow the tutorial Learnopencv tutorial, I already downloaded the file class-descriptions-boxable.csv and train-annotations-bbox.csv through the Git

I downloaded the files and put in the same folder as the file getDataFromOpenImages_snowman.py (shown below), but when I spin, it presents an error:

Traceback (most recent call last):

  File "C:\path\getDataFromOpenImages_snowman.py", line 12, in <module>
    subprocess.run(['rm', '-rf', 'JPEGImages'])

  File "C:\Users\name\AppData\Local\Programs\Python\Python37\lib\subprocess.py",
     line 472, in run with Popen(*popenargs, **kwargs) as process:

  File "C:\Users\name\AppData\Local\Programs\Python\Python37\lib\subprocess.py",
    line 775, in __init__ restore_signals, start_new_session)

  File "C:\Users\name\AppData\Local\Programs\Python\Python37\lib\subprocess.py",
    line 1178, in _execute_child startupinfo)

FileNotFoundError: [WinError 2] The system can not find the file specified

I have no experience in Python, I looked for subprocess documentation, however, I can’t understand the problem. Someone has a suggestion?

import csv
import subprocess
import os

runMode = "train"
classes = ["Snowman"]

with open('class-descriptions-boxable.csv', mode='r') as infile:
    reader = csv.reader(infile)
    dict_list = {rows[1]:rows[0] for rows in reader}

subprocess.run(['rm', '-rf', 'JPEGImages'])
subprocess.run([ 'mkdir', 'JPEGImages'])

subprocess.run(['rm', '-rf', 'labels'])
subprocess.run([ 'mkdir', 'labels'])

for ind in range(0, len(classes)):

    className = classes[ind]
    print("Class " + str(ind) + " : " + className)

    commandStr = "grep " + dict_list[className] + " " + runMode + "-annotations-bbox.csv"
    print(commandStr)
    class_annotations = subprocess.run(commandStr.split(), stdout=subprocess.PIPE).stdout.decode('utf-8')
    class_annotations = class_annotations.splitlines()

    totalNumOfAnnotations = len(class_annotations)
    print("Total number of annotations : "+str(totalNumOfAnnotations))

    cnt = 0
    for line in class_annotations[0:totalNumOfAnnotations]:
        cnt = cnt + 1
        print("annotation count : " + str(cnt))
        lineParts = line.split(',')
        subprocess.run([ 'aws', 's3', '--no-sign-request', '--only-show-errors', 'cp', 's3://open-images-dataset/'+runMode+'/'+lineParts[0]+".jpg", 'JPEGImages/'+lineParts[0]+".jpg"])
        with open('labels/%s.txt'%(lineParts[0]),'a') as f:
            f.write(' '.join([str(ind),str((float(lineParts[5]) + float(lineParts[4]))/2), str((float(lineParts[7]) + float(lineParts[6]))/2), str(float(lineParts[5])-float(lineParts[4])),str(float(lineParts[7])-float(lineParts[6]))])+'\n')
  • 1

    Translate the question, you’re on Sopt.

  • 2

    Yes. It’s been translated. Thank you!

  • 1

    Wouldn’t it be because you’re trying to make a call to rm -rf in Windows? Linux is used in the following tutorial...

  • Good, it may be that yes. I will research on and try to implement. Thank you!

1 answer

1

The subprocess.run() serves to execute subprocesses. This means it should be used when you want your script to run another executable program available on your computer.

In case you are running the program rm however, according to the error message, this command does not exist on your machine.

The program rm is widely used in linux to remove files and directories, however, it does not come installed in windows. To install it in windows you can access this gnuwin link and download.

An alternative would be to rewrite this part of the program to not use subprocesses, so it would work on any operating system, independent of the installed programs. Would look like this:

import os, shutil

# subprocess.run(['rm', '-rf', 'JPEGImages'])
shutil.rmtree('JPEGImages', ignore_errors=True)

# subprocess.run([ 'mkdir', 'JPEGImages'])
os.mkdir('JPEGImages')
  • In fact, this can make lines 12, 13, 15, 16 work. However, the code uses the subprocess below and again there is an error in class_annotations = subprocess.run(commandStr.split(), stdout=subprocess.PIPE).stdout.decode('utf-8'). But thank you!

  • The problem is the same. My answer explains what is happening. Download the grep.exe for windows aqui http://gnuwin32.sourceforge.net/packages/grep.htm and use, or you will need to rewrite what grep does.

  • Got it, thanks! It worked! Unfortunately I can’t get your answer

Browser other questions tagged

You are not signed in. Login or sign up in order to post.