在不同的文件python上使用子进程

时间:2011-10-29 08:00:10

标签: python file subprocess

我有一个简短的脚本问题,如果你能看看它会很棒!

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'对'observed_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 个答案:

答案 0 :(得分:1)

我假设你会从CLI调用loc3d filename。如果是,那么:

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这样做。

答案 1 :(得分:1)

目前,您的重定位方法将在第一次迭代后返回(对于第一个文件)。您根本不需要返回。

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的完整路径。

答案 2 :(得分:0)

-11退出代码可能意味着该命令被信号Segmentation fault杀死。 这是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

答案 3 :(得分:0)

刚刚发现loc3d,正如unutbu所说,依赖于几个变量,在特定情况下,我必须每次从我的目录创建和删除一个名为'observal_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)

现在,这工作得非常好,所以它应该回答我的问题。我想这很容易理解,它只是复制,改变dir和那种东西。