Импорт кода из файла в виде функции в python

#python #function #import

#python #функция #импорт

Вопрос:

По сути, у меня есть скрипт в одном файле, который я хотел бы импортировать и запустить как функцию в другом файле. Вот в чем загвоздка, содержимое первого файла НЕ может быть записано как определение функции, это просто должен быть простой старый скрипт (я пишу симулятор для моего набора robotics, поэтому важен пользовательский опыт). Я понятия не имею, как это сделать.

Адам

Ответ №1:

В виде функции можно записать что угодно.

Если вам дополнительно нужна возможность прямого вызова вашего скрипта, вы просто используете __name__ == '__main__' трюк:

 def my_function():
    ... code goes here ...

if __name__ == '__main__':
    my_function()
  

Теперь вы можете импортировать my_function из остальной части вашего кода, но по-прежнему выполнять файл напрямую, поскольку блок в конце вызовет функцию.

Ответ №2:

Предполагая, что код в файле, который вам нужно импортировать, представляет собой четко ограниченный скрипт, тогда вы можете прочитать его как текстовую переменную и использовать функцию «execfile» для создания функции из этого скрипта.

Под хорошо ограниченным я подразумеваю, что вы понимаете все необходимые данные и можете предоставить все это из своей программы.

Альтернативой было бы использовать «системный» вызов или модуль подпроцесса для вызова скрипта, как если бы это была внешняя программа (в зависимости от того, нужен ли вам вывод скрипта).

Последним подходом будет использование exec для создания функции — см. Подход 3.

Используемый вами подход определяет, для чего вам нужен другой скрипт..

примеры: hello.py (ваш файл, который вы хотите запустить, но не можете изменить):

 # Silly example to illustrate a script which does something.
fp = open("hello.txt", "a")
fp.write("Hello World !!!n")
fp.close()
  

Три подхода к использованию hello.py без импорта hello.py
импортировать ОС

 print "approach 1 - using system"
os.system("python hello.py")

print "approach 2 - using execfile"
execfile("hello.py", globals(), locals())

print "approach 3 - exec to create a function"

# read script into string and indent
with open("hello.py","r") as hfp:
     hsrc = ["    "   line for line in hfp]
# insert def line
hsrc.insert(0, "def func_hello():")

# execute our function definition
exec "n".join( hsrc) in globals(), locals()

# you now have a function called func_hello, which you can call just like a normal function

func_hello()
func_hello()

print "My original script is still running"
  

Комментарии:

1. Привет, я также должен был прояснить, что для этого необходимо выполнить функцию в потоке

2. Тогда мой подход 3 должен сработать, поскольку это фактически создает реальную функцию, которую вы можете выполнить, как показано.