Python:如何在脚本中运行另一个脚本?

1 投票
3 回答
3005 浏览
提问于 2025-04-30 07:34

我刚开始学习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 个回答

0

我觉得你是在寻找“subprocess”这个模块。

这里有一些关于它的信息:

https://docs.python.org/2/library/subprocess.html

你可以这样使用它:

import subprocess
subprocess.call(["command", "arguments"])
0

正如你所说,你开始学习Python了,你应该寻找:

import os
os.system('command')

但是,使用subprocess模块是更好的方法。

5

使用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()

这可以让你在不提前运行代码的情况下导入它,但仍然可以将该文件作为独立脚本运行。

撰写回答