我有一个简短的脚本问题,如果你能看看它会很棒!
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的输出应完全不同。
那么代码看起来不错吗?有什么我想念的吗?有什么建议吗?
感谢您的帮助!
答案 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和那种东西。