如何让一个Python文件运行另一个Python文件?
例如,我有两个.py文件。我想首先运行一个文件,然后让它运行另一个.py文件。
如何让一个Python文件运行另一个Python文件?
例如,我有两个.py文件。我想首先运行一个文件,然后让它运行另一个.py文件。
有几种方法可供选择,我将按照倒序偏好列出(例如,最佳选项排在第一位,最差的放在最后):
import file
。这是很好的选择,因为它安全、快速、易于维护。代码可以得到重复使用。大多数 Python 库都是使用多种方法跨越许多文件运行。强烈推荐。请注意,如果您的文件名为 file.py
,则您的 import
不应包括末尾的 .py
扩展名。execfile('file.py')
在 Python 2 中exec(open('file.py').read())
在 Python 3 中os.system('python file.py')
。在万不得已的情况下使用它。import fileB
。然后,在fileA中,您可以通过以下方式调用fileB中的任何函数:fileB.name_of_your_func()
。当然,还有更多选项和细节,但这样做可以使您开始运行。 - jonsubprocess
模块替代 os
模块。 - Hannes Karppila将以下内容放入main.py中:
#!/usr/bin/python
import yoursubfile
把这个放在你的subfile.py中。#!/usr/bin/python
print("hello")
运行它:
python main.py
它会打印出:
hello
因此,main.py
运行yoursubfile.py
有8种方法可以回答这个问题,一个更为常规的答案在这里:如何导入其他Python文件?
# noqa: F401
- Bruno L.我使用了subprocess.call,它与subprocess.Popen几乎相同。
from subprocess import call
call(["python", "your_file.py"])
import os
os.system('python filename.py')
注意:将文件放在主要 Python 文件所在的同一目录中。
tasklist | findstr "python"
进行测试) - TheLastAirbenderfrom subprocess import Popen
Popen('python filename.py')
filename.py
中有一个def func1()
,那么如何在Popen('python filename.py')
的方法下只运行这个特定的函数呢? - JasonPopen(['python3', 'filename.py'])
。 - ALMOSError: [WinError 193] %1 is not a valid Win32 application
错误。请参考https://stackoverflow.com/questions/25651990/oserror-winerror-193-1-is-not-a-valid-win32-application。 - undefineddef run(runfile):
with open(runfile,"r") as rnf:
exec(rnf.read())
语法:
run("file.py")
以下是从主脚本调用abc.py
的方式:
#!/usr/bin/python
import abc
abc.py
可能是这样的:
print'abc'
aa1
行是无意义的,因为导入文件时会自动运行。 - Bruno L.
# 斐波那契(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-Abramsexecfile()
,但通常模块更好。 - ephemientexecfile
已被移除,但一个简单的替代方法是读取源代码。详细信息请参见此处和@apc的答案。 - Vessel