由python程序调用的打印程序(或程序文件的路径)

时间:2014-01-25 17:19:47

标签: python

我在我的python程序中调用一个包含一组python和一些C ++程序的模块。 我想知道是否有办法打印执行程序时调用的程序列表。该模块不是由我编写的,包含许多程序,所以我想避免在每个程序中打印路径。

如果可能出现类似情况,请有人告诉我。

谢谢

2 个答案:

答案 0 :(得分:2)

您可以将sys.stdout替换为垃圾文件写入对象,以避免使用您不想要的语句。

import sys

class TrashFile(object):
    def write(self, arg):
        pass

i_stdout = sys.stdout
sys.stdout = TrashFile()

# Stop printing output on screen
print_trash()

sys.stdout = i_stdout

# Start to print
print_statement()

答案 1 :(得分:0)

你的问题不是很具体。我假设你的python模块调用单独的程序(即使用诸如os.system()之类的调用,或者标准模块'subprocess'),并且你想要确定调用哪些程序。

这是一个简单的python程序,它调用子进程:

import os
os.system("echo hello")

如果您使用的是Linux,则可以使用工具'strace'来跟踪程序所做的所有系统调用(而不仅仅是python程序)。

如果您的python程序名为'foo.py',那么您可以像这样运行strace:

strace -f -e trace=process python foo.py 2>output

我会分解它的作用:

  • -f导致strace跟踪子进程(及其系统调用)。
  • “ -​​ e trace = process”告诉strace仅跟踪与进程相关的系统调用。这减少了strace的输出量。
  • strace输出到stderr流 - 我们将其保存到文件'output'。

对于上述程序,输出如下所示:

execve("/usr/bin/python", ["python", "foo.py"], [/* 50 vars */]) = 0
clone(Process 1735 attached
child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0xbfe2b2ec) = 1735
[pid  1732] waitpid(1735, Process 1732 suspended
 <unfinished ...>
[pid  1735] execve("/bin/sh", ["sh", "-c", "echo hello"], [/* 50 vars */]) = 0
[pid  1735] exit_group(0)               = ?
Process 1732 resumed
Process 1735 detached
<... waitpid resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 1735
--- SIGCHLD (Child exited) @ 0 (0) ---
exit_group(0)                           = ?

搜索“exec”以查找调用子进程的位置。在这个例子中有两个:调用python本身,以及python调用“/ bin / sh”。

希望这有帮助。