eikonal
eikonal

Reputation: 171

using subprocess over different files python

I've got a problem with a short script, it'd be great if you could have a look!

import os
import subprocess

root = "/Users/software/fmtomov1.0/remaker_lastplot/source_relocation/observed_arrivals_loc3d"

def loop_loc3d(file_in):
    """Loops loc3d over the source files"""
    return subprocess.call (['loc3d'], shell=True)

def relocation ():
    for subdir, dirs, files in os.walk(root):
        for file in files:
            file_in = open(os.path.join(subdir, file), 'r')
            return loop_loc3d(file_in)

I think the script is quite easy to understand, it's very simple. However I'm not getting the result wanted. In a few word I just want 'loc3d' to operate over all the files contents present in the 'observed_arrivals_loc3d' directory, which means that I need to open all the files and that's what I've actually done. In fact, if I try to 'print files' after:

for subdir, dirs, files in os.walk(root)

I'll get the name of every file. Furthermore, if I try a 'print file_in' after

file_in = open(os.path.join(subdir, file), 'r')

I get something like this line for every file:

<open file '/Users/software/fmtomov1.0/remaker_lastplot/source_relocation/observed_arrivals_loc3d/EVENT2580', mode 'r' at 0x78fe38>

subprocess has been tested alone on only one file and it's working.

Overall I'm getting no errors but just -11 which means absolutely nothing to me. The output from loc3d should be completly different.

So does the code look fine to you? Is there anything I'm missing? Any suggestion?

Thanks for your help!

Upvotes: 1

Views: 272

Answers (4)

eikonal
eikonal

Reputation: 171

Just found out that loc3d, as unutbu said, relies on several variables and in the specific case one called 'observal_arrivals' that I have to create and delete every time from my directory. In Pythonic terms it means:

import os
import shutil
import subprocess

def loop_loc3d(file_in):
    """Loops loc3d over the source files"""
    return subprocess.call(["loc3d"], shell=True)

path = "/Users/software/fmtomo/remaker_lastplot/source_relocation"
path2 = "/Users/Programming/working_directory/2test"
new_file_name = 'observed_arrivals'
def define_object_file ():
    for filename in os.listdir("."):
        file_in = os.rename (filename, new_file_name) # get the observal_arrivals file
        file_in = shutil.copy ("/Users/simone/Programming/working_directory/2test/observed_arrivals", "/Users/software/fmtomo/remaker_lastplot/source_relocation")
        os.chdir(path) # goes where loc3d is
        loop_loc3d (file_in)
        os.remove("/Users/software/fmtomo/remaker_lastplot/source_relocation/observed_arrivals")
        os.remove ("/Users/Programming/working_directory/2test/observed_arrivals")
        os.chdir(path2)

Now, this is working very well, so it should answer my question. I guess it's quite easy to understand, it's just copying, changing dir and that kind of stuff.

Upvotes: 0

jfs
jfs

Reputation: 414129

-11 exit code might mean that the command killed by signal Segmentation fault. It is a bug in loc3d. A well-behaved program should not produce 'Segmentation fault' on any user input.

Feed loc3d only files that it can understand. Print filenames or use subprocess.check_call() to find out which file it doesn't like:

#!/usr/bin/env python
import fnmatch
import os
import subprocess

def loc3d_files(root):
    for dirpath, dirs, files in os.walk(root, topdown=True):
        # skip hidden directories
        dirs[:] = [d for d in dirs if not d.startswith('.')]
        # process only known files
        for file in fnmatch.filter(files, "*some?pattern[0-9][0-9].[ch]"):
            yield os.path.join(dirpath, file)

for path in loc3d_files(root):
    print path
    subprocess.check_call(['loc3d', path]) # raise on any error

Upvotes: 0

Uku Loskit
Uku Loskit

Reputation: 42040

Currently your relocation method will return after the first iteration (for the first file). You shouldn't need to return at all.

def loop_loc3d(filename):
    """Loops loc3d over the source files"""
    return subprocess.call (['loc3d',filename])

def relocation ():
    for subdir, dirs, files in os.walk(root):
        for file in files:
            filename = os.path.join(subdir, file)
            loop_loc3d(filename)

This is only one of the issues. The other is concerning loc3d itself. Try providing the full path for loc3d.

Upvotes: 1

unutbu
unutbu

Reputation: 879251

I assume you would call loc3d filename from the CLI. If so, then:

def loop_loc3d(filename):
    """Loops loc3d over the source files"""
    return subprocess.call (['loc3d',filename])

def relocation():
    for subdir, dirs, files in os.walk(root):
        for file in files:
            filename = os.path.join(subdir, file)
            return loop_loc3d(filename)

In other words, don't open the file yourself, let loc3d do it.

Upvotes: 1

Related Questions