簡體   English   中英

Python:如何從腳本中運行腳本?

[英]Python: How to run a script from within a script?

我開始學習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 )

使用python包管理器。 如果您的其他文件是run_this.py並具有一個名為main()的主函數,則您將添加

import run_this
run_this.main()

到您的腳本。 (通常,import語句將位於文件的頂部,而對run_this.main()的調用將在登錄邏輯之后。)

為了更好地理解,當您運行python腳本時,它將當前目錄添加到python path中 此路徑是python搜索軟件包和模塊的位置。 模塊是一些代碼...以.py結尾的文件。 為了使我的代碼片段正常工作,您必須從包含run_this.py的目錄中運行程序-以便該模塊位於您的路徑上。

為了讓您更好地組織代碼,您還可以使用packages-充滿代碼的文件夾。 任何包含名為__init__.py的文件的文件夾都可以是一個包。 Python將檢查path文件夾中包含的每個文件夾,以查看它是否為軟件包,如果是,將使其子文件可用。

假設您的結構是這樣的-

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解釋器在PYTHONPATH中添加了一些內容-在python目錄中,有一些文件夾(例如“ 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()的東西! 您將在python項目中看到的最后一個技巧是添加

    如果名稱 =='main':main()

這樣一來,您就可以導入代碼而無需提前運行它,但仍可以將該文件作為獨立腳本運行。

我認為您正在尋找子流程模塊。

這是關於它的一些信息: https : //docs.python.org/2/library/subprocess.html

您可以像這樣使用它:

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

正如您所說的,您開始學習python時,應該尋找:

import os
os.system('command')

但是使用子過程模塊是更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM