2014-09-26 105 views
4

我正在开发项目euler,并想要将所有代码都计算在内。我所拥有的是形式为'problemxxx.py'的文件目录,其中xxx是问题编号。这些文件中的每一个都有返回答案的main()函数。所以我创建了一个名为run.py的文件,它位于与问题文件相同的目录中。我可以通过命令提示符获取文件的名称。但是当我尝试导入问题文件时,我仍然得到ImportError: No module named problem。下面是迄今为止的run.py代码以及使用的命令提示符。如何通过命令提示符导入python文件?

# run.py 
import sys 
problem = sys.argv[1] 
import problem   # I have also tired 'from problem import main' w/ same result 

# will add timeit functions later, but trying to get this to run first 
problem.main() 

命令提示,我已经试过有以下几种:(两者给出的ImportError上述)

python run.py problem001 
python run.py problem001.py 

我怎样才能从文件导入problem001.py功能main()?导入不能用作为变量存储的文件名称吗?是否有比通过命令提示符获取文件名更好的解决方案?让我知道是否需要添加更多信息,并感谢您的帮助!

+0

看到这个答案: http://stackoverflow.com/questions/6677424/how-do-i-import-variable-packages- in-python-like-using-variable-variables-i – OregonTrail 2014-09-26 15:32:17

回答

2

您可以通过使用__import__()功能做到这一点。

# run.py 
import sys 
problem = __import__(sys.argv[1], fromlist=["main"])   # I have also tired 'from problem import main' w/ same result 
problem.main() 

然后,如果你有problem001.py这样的:

def main(): 
    print "In sub_main" 

调用python run.py problem001打印:

In sub_main 

一个更清洁的方式做到这一点(而不是__import__方式)是使用importlib模块。你run.py需求的变化:

import importlib 
problem = importlib.import_module(sys.argv[1]) 

其他选择在这个question提及。

+0

感谢您提供多种选择,我喜欢使用importlib的干净方式。这是推荐的方法,因为已经提到__import__不被推荐? – DavidC 2014-09-26 15:45:10

+0

是的,importlib是一个更好的选择。 – Andy 2014-09-26 15:46:25

1

当然!您可以使用__ import_内置函数,如__import__(problem)。然而,这不建议使用,因为它在编码风格方面不太好。我认为如果你正在使用这个测试目的,那么你应该使用unittest模块,无论哪种方式试图避免这些结构。

问候

0

您可以重复使用exec()技巧:

import sys 
    problem = sys.argv[1] 
    exec('import %s' % problem) 
    exec('%s.main()' % problem) 
相关问题