我正在编写运行用户脚本的测试人员:
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"
答案 0 :(得分:3)
请参阅imp module,特别是imp.load_module
和imp.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)