当前位置: 首页 > 知识库问答 >
问题:

将子进程调用的每个输出重定向到不同文件中的不同目录

谭畅
2023-03-14

我有一个很大的文件,我想使用< code>awk来分割它,并根据第一列中的值来命名它。

终端上的awk命令将用作:

cat phased.MySpF1.vcf | awk '!/^#/{print>$1}'

从而根据第一列的值创建像1、2、3这样的独立文件。


我想把这个命令放在python2文件中,这样我就可以将分割的文件存储在另一个子目录中,这使得在后面的部分中访问每个块变得容易。

# create a directory to store the splitted files:
if os.path.exists('SplitVCF'):
    shutil.rmtree('SplitVCF', ignore_errors=False, onerror=None)
os.makedirs('SplitVCF')

# now split the vcf file
split_cmd = ['cat', vcf_path, '|', 'awk', '!/^#/{print>$1}']
subprocess.Popen(split_cmd, stdout='SplitVCF/')

#or,
subprocess.call(split_cmd, stdout='SplitVCF/')

但是,我收到的错误是:

Traceback (most recent call last):
  File "phaser.py", line 2167, in <module>
    main();
  File "phaser.py", line 227, in main
    subprocess.Popen(split_cmd, stdout='SplitVCF/')
  File "/usr/lib/python2.7/subprocess.py", line 386, in __init__
    errread, errwrite), to_close = self._get_handles(stdin, stdout, stderr)
  File "/usr/lib/python2.7/subprocess.py", line 823, in _get_handles
    c2pwrite = stdout.fileno()
AttributeError: 'str' object has no attribute 'fileno'

共有1个答案

闻人哲茂
2023-03-14

从文档中

stdin、stdout和stderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为PIPE、现有文件描述符(正整数)、现有文件对象和无

所以不是一串。相反,做

with open('a/file/path', 'w') as out:
     subprocess.Popen(split_cmd, stdout=out)
 类似资料:
  • 问题内容: 我C编码的一个基本的壳,用于执行基本命令它会执行命令,,等。 我想在我的外壳中执行以下命令。喜欢 ; 这将给我包含过程输出的文件。我找到了一个解决方案,它正在像这样更改shell中的命令。在这种情况下,它将更改为。但是此过程会将输出也提供给文件和终端。如何在终端中停止打印输出。 还是有比使用tee命令更好的解决方案。提前致谢… 问题答案: 这是我用dup2测试的结果 更微妙的一点是在正

  • 本文向大家介绍利用Log4j将不同Package的日志输出到不同文件的方法,包括了利用Log4j将不同Package的日志输出到不同文件的方法的使用技巧和注意事项,需要的朋友参考一下 前言 随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就存在以下这些日志: 接收外界消息的日志、对外发送消息的日志; 后台常驻线程的处理日志

  • 问题内容: 我想从Groovy程序中执行foo.bat,并将生成的进程的输出重定向到stdout。Java或Groovy代码示例都可以。 foo.bat可能需要花费几分钟才能运行并生成大量输出,因此我希望在生成后立即查看输出,而不是必须等到该过程完成之后才能立即查看所有输出。 问题答案: 它使用一个类读取执行的程序生成的所有输出,并将其显示在其自己的stdout中。

  • 问题内容: 我很了解: 有什么方法可以将stderr输出到错误文件,并在bash的同一行中将stdout输出到输出文件? 问题答案: 只需将它们添加到一行中 但是,请注意,如果文件已经有数据,则用于追加。而将覆盖文件中的所有现有数据。 因此,如果您不想附加。 仅出于完成的缘故,您可以编写,因为默认文件描述符是输出。所以,是同一回事。 因此,成为

  • 问题内容: 我正在AIX 6上工作,在KIX Shell上运行Java命令,并且正在尝试调试类加载问题。我放了-verbose:class来打印加载的类,然后>> / home / user / log.log将控制台放到一个文件中。已创建log.log文件,但其大小为零。文件不包含任何信息,所有详细信息都在一闪而过。 问题答案: 也尝试重定向: 您的Java代码可能正在编写您的命令未重定向的信息

  • 问题内容: 我正在尝试使用Tkinter GUI启动子进程并将其stdout / stderr输出显示到Text小部件。最初,我认为可以通过设置“ sys.stdout = text_widget”轻松将sys.stdout重定向到Text小部件,但似乎不行。出现错误:“文本实例没有属性’flush’”。 我在线检查并得到了一些解决方案,例如使用队列与子进程进行通信。但是,由于我的特殊要求,它们都