Python:如何从脚本中运行脚本?

时间:2014-10-29 02:36:11

标签: python

我开始学习python,我制作了一个包含登录窗口的程序。一旦用户登录,我想用实际程序运行一个新脚本,但我不想将这些脚本代码放入windows中的日志中,以保持代码整洁有序。我该怎么做呢?

我的代码是通用形式:

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 :(得分:4)

使用python包管理器。如果你的另一个文件是run_this.py并且有一个名为main()的main函数,你可以添加

import run_this
run_this.main()

到您的脚本。 (通常,import语句将位于文件的顶部,而对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运行应用程序,则可以使用

import logic.run_this
import logic.another_file
在gui.py中

访问他们的代码。此外,从run_this.py内部,您可以使用

import gui
import logic.another_file

这是因为gui在python路径上被拾取,而another_file没有...但是包逻辑确实被拾取,并且包含another_file。

你会注意到你的python解释器在你的python目录中为你的PYTHONPATH添加了一些东西,这些文件夹就像“site-packages”一样被添加到路径中。在某处有一个文件或打包的名为tkinter,你在这个文件的开头导入:)

修改

导入该模块时,将执行模块的实际内容。定义函数和类,并执行未包含在任何内容中的代码。代码如

模块A

a = "world"
print a

模块B

import A
print "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项目中看到的最后一个技巧是添加

    如果名称 =='main':     main()的

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

答案 1 :(得分:0)

我认为您正在寻找子进程模块。

以下是有关它的一些信息: https://docs.python.org/2/library/subprocess.html

你可以像这样使用它:

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

答案 2 :(得分:0)

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

import os
os.system('command')

但使用子进程模块是更好的方法。