использование подпроцесса над разными файлами python - PullRequest
1 голос
/ 29 октября 2011

У меня проблема с коротким скриптом, было бы здорово, если бы вы могли взглянуть!

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)

Я думаю, что скрипт довольно прост для понимания, он очень прост.Однако я не получаю желаемого результата.Короче говоря, я просто хочу, чтобы loc3d работал со всем содержимым файлов, присутствующим в каталоге наблюдаемых_arrivals_loc3d, что означает, что мне нужно открыть все файлы, и это то, что я на самом деле сделал.Фактически, если я попытаюсь «напечатать файлы» после:

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

, я получу имя каждого файла.Кроме того, если я попытаюсь выполнить команду «print file_in» после

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

, я получу примерно такую ​​строку для каждого файла: подпроцесс

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

был протестирован отдельно только для одного файла, и онработает.

В целом я не получаю ошибок, только -11, что для меня абсолютно ничего не значит.Вывод из loc3d должен быть совершенно другим.

Так выглядит ли вам код нормально?Я что-то пропустил?Любое предложение?

Спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 29 октября 2011

В настоящее время ваш метод перемещения вернется после первой итерации (для первого файла). Вам вообще не нужно возвращаться.

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)

Это только одна из проблем. Другое касается loc3d самого. Попробуйте указать полный путь для loc3d.

1 голос
/ 29 октября 2011

Полагаю, вы бы позвонили loc3d filename из CLI. Если так, то:

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)

Другими словами, не открывайте файл самостоятельно, позвольте loc3d сделать это.

0 голосов
/ 01 ноября 2011

Только что выяснилось, что loc3d, как сказал unutbu, зависит от нескольких переменных, а в конкретном случае - от имени'viewval_arrivals ', которые я должен создавать и удалять каждый раз из своего каталога. С точки зрения Pythonic это означает:

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)

Теперь, это работает очень хорошо, так что это должно ответить на мой вопрос. Я думаю, это довольно легко понять, это просто копирование, изменение директории и тому подобное.

0 голосов
/ 30 октября 2011

-11 код выхода может означать, что команда прервана из-за ошибки сегментации сигнала.Это ошибка в loc3d.Хорошо функционирующая программа не должна выдавать «Ошибка сегментации» при любом вводе пользователем.

Подача loc3d только файлов, которые она может понять.Напечатайте имена файлов или используйте subprocess.check_call(), чтобы узнать, какой файл ему не нравится:

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...