2014-01-25 2 views
0

Я вызываю модуль в моей программе python, которая содержит набор python и несколько программ на C++. Я хотел бы знать, есть ли способ распечатать список программ, вызываемых при выполнении моей программы. Модуль не был написан мной и содержит много программ, поэтому я хотел бы избежать пути печати в каждой предлагаемой программе.программы печати (или путь к программным файлам), вызываемые программой python

Возможно, кто-то может сообщить мне, возможно ли это или что-то подобное.

Благодаря

+1

Довольно сложно без каких-либо знаний о вашей программе python или вызываемом модуле ... – Hyperboreus

+0

любая команда терминала, которая может помочь? Я попробовал systrace, но результат слишком подробный, и поскольку есть много программ, это не помогает. – user1620745

ответ

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() 
0

Ваш вопрос не очень конкретный. Я предполагаю, что ваш модуль python вызывает отдельные программы (т. Е. Используя такие вызовы, как os.system() или стандартный подпроцесс модуля) и что вы хотите определить, какие программы вызывается.

Вот тривиальный питон программа, которая вызывает подпроцесс:

import os 
os.system("echo hello") 

Если вы используете Linux, вы можете использовать инструмент «Трассирование», чтобы отслеживать все системные вызовы программа делает (не только питон программы) ,

Если ваша программа питон называется «foo.py», то вы можете запустить Трассирование так:

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

Я сломаться, что это делает:

  • -f вызывает Трассирование для отслеживания подпроцессов (и их системных вызовов).
  • "-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».

Надеюсь, это поможет.

Смежные вопросы