一千萬個為什麽

搜索

按用戶輸入的文件路徑導入文件

我正在編寫運行用戶腳本的測試人員:

tester d:\scripts\test_scripts_list.txt

test_scripts_list.txt看起來像這樣:

test1
d:\123\test2

我的程序使用 argparse 模塊讀取命令行,讀取 test_scripts_list.txt 的每一行並使用 __ import __ 導入每個測試文件(實際運行測試文件)。
這很好用。

我唯一的問題是導入 d:\ 123 \ test2 ,它給了我:

ImportError: Import by filename is not supported.

我認為這可以通過分析路徑名來解決,在使用 sys.path.append 運行時將其添加到 PYTHONPATH ,然後導入它。但這似乎是一個復雜的靈魂 你有更好的主意嗎?

Note: test1's path is already in PYTHONPATH

EDIT My current solution:

# 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"

最佳答案

請參閱 imp模塊,特別是 imp.load_moduleimp.load_source 函數。這是您可以使用它們的一種方式(來自Mercurial的源代碼,略有簡化):

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)

轉載註明原文: 按用戶輸入的文件路徑導入文件