Python:如何在脚本中运行另一个脚本?
我刚开始学习Python,做了一个包含登录窗口的程序。当用户登录后,我想运行一个新的脚本,但我不想把那个脚本的代码放进登录窗口里,这样可以保持代码的整洁和有序。我该怎么做呢?
我的代码大致是这样的:
from tkinter import *
from re import *
import tkinter.messagebox as box
window = Tk()
window.title( 'Please Login' )
frame = Frame( window )
entry = Entry( frame )
password = Entry( frame , show='*' )
lbl1 = Label( frame , text="Name: " )
lbl2 = Label( frame , text="Alpha Key: " )
pattern = \
compile( 'GENERICPASSWORD' )
def get_passwrd() :
passwrd = ( password.get() )
is_valid = pattern.match( passwrd )
if is_valid :
# This is where I would like it to run a new script with the actual program.
else :
box.showinfo( 'Access Denied' , 'Please Try Again' )
btn = Button( frame , text = 'Log In' , command=get_passwrd )
btn.grid( row=3 , columnspan=2 )
entry.grid( row=1 , column=1 )
password.grid( row=2 , column=1 )
lbl1.grid( row=1 , sticky=E )
lbl2.grid( row=2 , sticky=E )
frame.grid( row=1 , padx=20 , pady=20 )
3 个回答
我觉得你是在寻找“subprocess”这个模块。
这里有一些关于它的信息:
https://docs.python.org/2/library/subprocess.html
你可以这样使用它:
import subprocess
subprocess.call(["command", "arguments"])
正如你所说,你开始学习Python了,你应该寻找:
import os
os.system('command')
但是,使用subprocess模块是更好的方法。
使用Python的包管理工具。如果你的文件叫做run_this.py,并且里面有一个叫main()的主函数,你需要在你的脚本中添加
import run_this
run_this.main()
(通常,导入语句会放在文件的顶部,而调用run_this.main()的代码会放在登录逻辑之后。)
为了更好地理解,当你运行一个Python脚本时,它会把当前目录添加到python路径中。这个路径是Python用来查找包和模块的地方。模块就是一段代码,也就是以.py结尾的文件。为了让我的代码片段正常工作,你需要从包含run_this.py的目录运行你的程序,这样这个模块才能在你的路径中。
为了更好地组织你的代码,你还可以使用包——也就是装满代码的文件夹。任何包含一个叫__init__.py
的文件的文件夹都可以成为一个包。Python会检查路径文件夹中的每个文件夹,看看它是否是一个包,如果是的话,就会让它的子文件可用。
假设你的结构是这样的-
parent_folder
gui.py
sub_gui.py
logic
__init__.py
run_this.py
another_file.py
如果你从parent_folder运行你的应用程序,你可以在gui.py中使用
import logic.run_this
import logic.another_file
来访问它们的代码。此外,在run_this.py中,你可以使用
import gui
import logic.another_file
这是因为gui在Python路径中被找到,而another_file没有……但是包的逻辑是可以被找到的,它里面包含了another_file。
你会注意到,Python解释器会在你的PYTHONPATH中添加一些东西——在你的Python目录里有一些像“site-packages”的文件夹会被添加到路径中。在那里有一个叫tkinter的文件或包,你在这个文件的开头导入了它 :)
编辑
当一个模块被导入时,它的实际内容会被执行。函数和类会被定义,而不包含在任何东西里的代码会被执行。像这样的代码
模块A
a = "world"
print a
模块B
import A
print "hello"
会输出“world hello”。相反,把你的逻辑放到一个像函数这样的结构中-
模块A
def main():
a = "world"
print a
模块B
import A
print "hello"
A.main()
会输出“hello world”。注意main()是在模块内部定义的,所以我们称之为A.main!我们也可以从模块中导入一个单独的标识符-
from A import main
只会导入那个函数(而不是文件中的其他函数或类)。然后我们可以在不提到模块的情况下执行它
main()
不过在这种情况下,我们得小心不要在当前模块中有其他叫main()的东西!你在Python项目中还会看到一个最后的技巧,就是添加
if name == 'main': main()
这可以让你在不提前运行代码的情况下导入它,但仍然可以将该文件作为独立脚本运行。