2014-06-24 171 views
2

我有腳本:導入Python腳本

moving1.py

def move(): 
    print("walk!") 

moving2.py

def move(): 
    print("run!") 

而且man.py,即可以通過參數參數moving1或move2腳本來接受動作。

man.py

import sys 

if len(sys.argv) <= 1: 
    exit("Too less arguments calling script") 

__import__(sys.argv[1]) 
moving = sys.modules[sys.argv[1]] 

def move(): 
    moving.move() 

現在我有testman.py劇本,有測試man.py執行的所有變體:

testman.py

import man #and somehow add here as argument "moving1" 
man.move() 

import man #and somehow add here as argument "moving2" 
man.move() 

存在很多類似的問題,但它們並不完全符合我的要求。我怎樣才能爲導入的腳本添加參數?問題是不檢查

if __name__ = "__main__": 

存在,問題是與我想要的參數完全相同導入腳本。可能嗎?

+0

你不能只是像這樣提出一個字符串:「異常必須是舊式類或從BaseException派生,而不是unicode」 –

+0

Thx,修復了這個問題。 – Arkady

+0

爲什麼存在這種分離?在同一個文件中包含函數並且僅將一個命令行參數映射到函數會容易得多。 – msvalkon

回答

2

你應該分開你的參數處理代碼和導入代碼:

man.py

import sys 

def move(): 
    moving.move() 

def setup(module): 
    global moving 
    moving = __import__(module) 

if __name__ == "__main__": 
    if len(sys.argv) <= 1: 
     exit("Too less arguments calling script") 

    setup(sys.argv[1]) 

testman.py

import man 
man.setup(<name>) 
man.move() 

然而,這似乎是一個實現你正在嘗試做的事情的方式非常奇怪。也許你可以澄清你的目標?

+0

這不起作用。在「導入人」行中將會引發異常,因爲不會有任何參數。 – Arkady

+0

哎呀!意思是移動所有參數處理代碼...修正! –

+0

如果不存在通過解析參數導入腳本作爲參數的方式,我會使用它,謝謝! – Arkady

2

如果您將filename作爲命令行參數,並且要導入它,請使用imp load_source模塊。

import imp 
module = imp.load_source("module.name", sys.argv[1]) 
#Then call the function 
module.move() 

基本imp模塊有助於在運行時加載模塊。

希望這會有所幫助!

+0

謝謝,但如果我這樣修改testman.py: import imp man = imp.load_source(「man」,「moving1」) 然後它不起作用。 「文件未找到」。如果我添加「.py」。它仍然無法找到「man.py」並告訴我錯誤:moving1.py:4:RuntimeWarning:處理絕對導入時未找到父模塊'man' 導入日誌記錄 – Arkady

+0

@Arkady在這種情況下,您必須獲取即使我添加os.path.dirname(os.path.abspath(__ file__))之前,文件的絕對路徑(追加當前工作目錄或從\ _ \ _ FILE \ _ \ _獲取路徑)並將其傳遞給load_source – user2109788

+0

文件名,它仍然有問題。它看起來像它想要「導入日誌記錄」的絕對路徑... – Arkady