如何让一个Python文件运行另一个Python文件?

425

如何让一个Python文件运行另一个Python文件?

例如,我有两个.py文件。我想首先运行一个文件,然后让它运行另一个.py文件


3
好的,我会尽力以通俗易懂的方式翻译这份Python教程中的模块部分,但不能改变原意。Python教程:模块在Python中,模块是一个包含Python定义和声明的文件。文件名即为模块名加上扩展名 .py。在一个模块中,你可以定义函数、类和变量。例如,假设你有一个如下所示的文件名为fibo.py的文件:# 斐波那契(fibonacci)数列模块 def fib(n): # 打印斐波那契数列到 n a, b = 0, 1 while b < n: print(b), a, b = b, a+b def fib2(n): # 返回斐波那契数列到 n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result现在可以在脚本中导入fib模块,并调用其中的函数:import fibo fibo.fib(1000) fibo.fib2(100) fibo.__name__输出结果为:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 'fibo'如果你不想每次都输入模块名前缀,可以使用from...import语句:from fibo import fib, fib2 fib(500)这样就不需要写出“fibo.”了。还有一种导入方式是使用通配符*:from fibo import * fib(500)这样会导入所有定义(除了以一个下划线开头的命名)的函数、变量和类,但是这种方法不够安全,因为它可能导致名称冲突。 - Ignacio Vazquez-Abrams
2
也可以使用execfile(),但通常模块更好。 - ephemient
1
另外,可以查看此链接(https://dev59.com/vnM_5IYBdhLWcg3w3nbz#71311113),它使用了`os.startfile`。 - Faraaz Kurawle
请查看此答案:https://stackoverflow.com/a/71967141/1364242 - Jay M
12年后,execfile已被移除,但一个简单的替代方法是读取源代码。详细信息请参见此处和@apc的答案 - Vessel
8个回答

647

有几种方法可供选择,我将按照倒序偏好列出(例如,最佳选项排在第一位,最差的放在最后):

  1. 将其视为模块: import file。这是很好的选择,因为它安全、快速、易于维护。代码可以得到重复使用。大多数 Python 库都是使用多种方法跨越许多文件运行。强烈推荐。请注意,如果您的文件名为 file.py,则您的 import 不应包括末尾的 .py 扩展名。
  2. 臭名昭著的(不安全的)exec 命令: 不安全,不专业,通常是错误的答案。尽可能避免使用。
    • execfile('file.py') 在 Python 2 中
    • exec(open('file.py').read()) 在 Python 3 中
  3. 生成一个 Shell 进程: os.system('python file.py')。在万不得已的情况下使用它。

95
仅在案例#1中增加一点细节:假设您想将fileB.py导入到fileA.py中。假设这些文件在同一个目录中,在fileA中,您应该写import fileB。然后,在fileA中,您可以通过以下方式调用fileB中的任何函数:fileB.name_of_your_func()。当然,还有更多选项和细节,但这样做可以使您开始运行。 - jon
29
使用 subprocess 模块替代 os 模块。 - Hannes Karppila
10
使用import语句将函数进行命名空间封装,例如函数()变成了文件名.函数()。为避免这种情况,请使用"from name import *"语句。这还将运行代码主体。使用os.system()运行将不会保留定义的函数(因为它是在另一个进程中运行的)。execfile在Python 3中被exec()替代,并且不起作用。 - CoderGuy123
4
"execfile" 已经成功执行 :D - endolith
14
我对如何使用“import()”将参数定义到其他.py脚本中感兴趣。 - macetw
显示剩余17条评论

81

使用Python 2.7.3和Ubuntu 12.10,让一个Python文件运行另一个Python文件:

  1. 将以下内容放入main.py中:

    #!/usr/bin/python
    import yoursubfile
    
    把这个放在你的subfile.py中。
    #!/usr/bin/python
    print("hello")
    
  2. 运行它:

    python main.py 
    
  3. 它会打印出:

  4. hello
    

因此,main.py运行yoursubfile.py

有8种方法可以回答这个问题,一个更为常规的答案在这里:如何导入其他Python文件?


2
确保我们在导入Python脚本文件名时不使用“.”(点)。 - Santosa Sandy
1
哦,请把分号去掉吧。作为一个正在康复的C/C++程序员,这让我眼睛疼! - steffen
7
如何向你的subfile.py传递参数? - Agnel Vishal
运行良好,但是你可以看到一个警告,因为导入的文件没有被使用。使用Flake8,你可以忽略它:# noqa: F401 - Bruno L.
1
@AgnelVishal 如果要将命令行参数传递给脚本,您可以编辑sys.argv列表。 - tejasvi88
显示剩余2条评论

49

我使用了subprocess.call,它与subprocess.Popen几乎相同。

from subprocess import call
call(["python", "your_file.py"])

1
请在您的答案中添加解释。 - ADreNaLiNe-DJ
1
获取“NameError:name'python'未定义”的错误 - Tahlor
1
@Tahlor 在环境变量中将python.exe目录添加到你的PATH变量中。 - Jonathan
@Tahlor,添加shell=True - EJL
2
如果程序出现像消息传递中的无限循环,我该如何终止程序的执行? - Arpan Srivastava
这个调用是否可以发送参数? - keramat

33
  • 您可以使用以下代码简单运行您的 .py 文件:

import os 
os.system('python filename.py')

注意:将文件放在主要 Python 文件所在的同一目录中。


1
这会生成另一个进程吗? - Moondra
不总是有效的。-1 - CristiFati
13
什么情况下它不能工作? - Gulzar
2
@Moondra 是的,在 Windows 上,这种方法会生成另一个进程。另一方面,导入文件则不会。(通过在 cmd 中运行 tasklist | findstr "python" 进行测试) - TheLastAirbender

18

3
正是我所需要的。所有其他答案都不允许同时创建多个次要Python文件实例。它们都等待执行完成,然后才能再次调用该文件。只有Popen允许多个异步调用。再次感谢。 - Chandral
1
如果在filename.py中有一个def func1(),那么如何在Popen('python filename.py')的方法下只运行这个特定的函数呢? - Jason
2
在Python3中,我需要使用Popen(['python3', 'filename.py']) - ALM
我使用这个解决方案时出现了“OSError: [WinError 193] %1 is not a valid Win32 application”错误。请参见https://dev59.com/2F8e5IYBdhLWcg3whqvl。 - Theo F
我使用这个解决方案时遇到了OSError: [WinError 193] %1 is not a valid Win32 application错误。请参考https://stackoverflow.com/questions/25651990/oserror-winerror-193-1-is-not-a-valid-win32-application。 - undefined

6
你可以使用这个脚本:
def run(runfile):
  with open(runfile,"r") as rnf:
    exec(rnf.read())

语法:

run("file.py")

2
这背后的逻辑是什么? - Enkouyami
非常晚回复,但它基本上需要一个文件(变量runfile),打开它,读取其内容。(内容在rnf.read()函数中读取)这些内容随后被作为Python代码执行,因此使用了exec()调用。关于exec的信息可以在此处找到。 - xcrafter_40
但是,这样做的逻辑是什么,而不是简单地执行“exec(“file.py”)”,如此答案所述? - JBentley
1
你可能是指execfile("file.py"),但它在Python 3中不被支持。 - Mike Battaglia

3
您可以将其中一个文件当作Python模块处理,并让另一个文件导入它(就像导入标准的Python模块一样)。后者可以引用导入模块中定义的对象(包括类和函数)。该模块还可以运行所需的任何初始化代码。请参见http://docs.python.org/tutorial/modules.html

1

以下是从主脚本调用abc.py的方式:

#!/usr/bin/python
import abc

"

abc.py可能是这样的:

"
print'abc'

我认为aa1行是无意义的,因为导入文件时会自动运行。 - Bruno L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接