【问题标题】:using subprocess over different files python在不同的文件python上使用子进程
【发布时间】:2011-11-04 12:14:30
【问题描述】:

我有一个简短的脚本有问题,如果你能看一下就太好了!

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 的输出应该完全不同。

那么代码对您来说看起来不错吗?有什么我想念的吗?有什么建议吗?

感谢您的帮助!

【问题讨论】:

  • 这对我来说有点难以理解。无论如何,我尝试了您在下面所说的内容,但没有任何反应(没有输出没有错误)。在这个阶段,我确实认为这是一个“loc3d”错误,所以就 python 而言,可能一切都很好。将尝试更深入地研究 loc3d。

标签: python file subprocess


【解决方案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来做吧。

【讨论】:

  • loc3d filename 在命令行中是否按预期工作? loc3d 是否有 -v 详细模式?如果是这样,调用subprocess.call (['loc3d','-v',filename]) 可能会为您提供更多调试信息。
  • 是的,它确实有效....使用 -v 它仍然有效,但现在没有任何输出,也没有错误。
  • 也许loc3d 依赖于从subprocess.call 调用时不存在的环境变量。 subprocess.Popen('loc3d filename', shell=True) 有效吗?
  • 如果知道loc3d需要的环境变量,最好不要使用shell=True,直接提供环境变量:subprocess.Popen(['loc3d',filename],env={'NAME':'VALUE',...})
  • Popen 给出相同的结果(即没有)。我知道 loc3d 需要什么,但它是一长串文件。例如,我试图在 411 个文件上对其进行迭代。奇怪的是它适用于文件,但不适用于所有文件。
【解决方案2】:

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

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

【讨论】:

  • 它看起来工作了几秒钟,但没有输出也没有错误......
  • 知道在哪里可以下载 loc3d 进行测试吗?
  • 很遗憾你不能,我想我不能在这里附加任何东西,否则这将是个好主意!
【解决方案3】:

-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

【讨论】:

  • 非常感谢 J.F.,你真的很接近问题所在,我的意思是,我经常遇到“分段错误”。我会尽快尝试,然后通知您。
  • @eikonal:在评论中你说什么都没有发生。如果您正在讨论上述代码,那么您必须更改文件模式 "*some?pattern[0-9][0-9].[ch]" 例如,将所有 .txt 文件提供给 loc3d 您可以使用 "*.txt" 文件模式。如果您想处理名称以点开头的目录中的文件,则必须删除上述代码中的 dir[:] = ... 行。如果loc3d_files() 产生至少一个文件名,您必须至少在输出中看到一些内容。
【解决方案4】:

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

现在,这运行得很好,所以它应该回答我的问题。我想这很容易理解,它只是复制,更改目录之类的东西。

【讨论】:

  • 1.不要发布问题作为答案。 2. 这段代码有很多问题。阅读Python Tutorial。这将节省您的时间。 3.open('fort.14', 'r')表示:打开文件'fort.14'进行阅读。如果文件不存在,它不会创建它。
  • 这种情况应该怎么办?我的意思是我认为提出一个新问题不是一个好主意,我认为我不能在评论中发布它。显然 fort.14 已经存在。
  • 创建一个 complete(即,您可以按原样运行它)、minimal(即,如果您从中删除任何内容,问题就会消失)显示您的问题并将其作为新问题发布的示例。如果您认为上一个问题相关,您可以添加一个链接。
  • 添加完整的回溯(您在输出中看到的OSError: ... 之前的行)。
  • 我已经整理好了...你知道吗?千万不要在夜间编程,你可能会犯非常愚蠢的错误。无论如何,我将编辑最后一个答案并留下没有添加的问题
猜你喜欢
  • 2012-10-21
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多