2011-12-21 53 views
2

我寫測試儀進入運行用戶腳本:導入文件由用戶

tester d:\scripts\test_scripts_list.txt 

的test_scripts_list.txt看起來是這樣的:

test1 
d:\123\test2 

我的程序讀取與命令行模塊模塊,讀取test_scripts_list.txt的每一行,並導入每個測試文件與__import__(實際運行測試文件)。
這是行之有效的。

我唯一的問題是導入d:\ 123 \ TEST2這是給我:

ImportError: Import by filename is not supported. 

我認爲這是可以通過分析路徑名來解決,把它添加到PYTHONPATHsys.path.append和運行時比導入它。但它似乎是一個複雜的靈魂。
你有更好的主意嗎?

注:TEST1的路徑已經在PYTHONPATH

編輯 我目前的解決方案:

# Go over each line in scripts_filename and import all tests 
for line in open(scripts_file.scripts_filename): 
    line = line.strip() 

    if not line or line[0] == '#': 
     # Ignore empty line and line with comment 
     continue 
    elif line[1] == ':' and line[2] == '\\': 
     # Find the last position of '\\' 
     file_name_pos = line.rfind('\\') 
     # Separate file path and filename (I.E [0:5] will take 4 first chars and [4:] will take all chars except the 4 chars) 
     file_path_string = line[0:file_name_pos+1] 
     file_name_string = line[file_name_pos+1:] 
     # Append file_path_string to PYTHONPATH in order to import it later 
     sys.path.append(file_path_string) 

     import_name = file_name_string 
    else: 
     import_name = line 

    try: 
     # Try to import test 
     print "Run test : %s" % line 
     __import__(import_name) 
    except ImportError: 
     print "Failed! (Test not found). Continue to the next test" 

回答

3

imp module,特別是imp.load_moduleimp.load_source功能。這裏有一種方法,你可以用它們(從Mercurial的source code,稍作簡化):

def loadpath(path): 
    module_name = os.path.basename(path)[:-3] 
    if os.path.isdir(path): 
     # module/__init__.py style 
     d, f = os.path.split(path.rstrip('/')) 
     fd, fpath, desc = imp.find_module(f, [d]) 
     return imp.load_module(module_name, fd, fpath, desc) 
    else: 
     return imp.load_source(module_name, path) 
+0

看來我還需要分析文件中的行,單獨的路徑和模塊的名稱,然後右鍵打電話給你function.am我? – 2011-12-21 09:27:25

+0

現在我的靈魂是:file_name_pos = line.rfind('\\')file_path_string = line [0:file_name_pos + 1] file_name_string = line [file_name_pos + 1:] sys.path.append(file_path_string) – 2011-12-21 09:29:51

+0

模塊名稱可以基本上任何東西。我已經更新了答案,以顯示計算它的一種方式。 – 2011-12-21 11:13:30