按用户输入的文件路径导入文件

时间:2011-12-21 08:51:41

标签: python environment-variables python-import

我正在编写运行用户脚本的测试人员:

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.

我认为这可以通过分析路径名称来解决,在使用PYTHONPATH运行时将其添加到sys.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"

1 个答案:

答案 0 :(得分: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)