我正在研究项目euler并希望计算我的所有代码。我所拥有的是'problemxxx.py'形式的文件目录,其中xxx是问题编号。每个文件都有一个main()
函数,可以返回答案。所以我创建了一个名为run.py的文件,该文件与问题文件位于同一目录中。我可以通过命令提示符获取文件的名称。但是当我尝试导入问题文件时,我继续得到ImportError: No module named problem
。下面是run.py到目前为止的代码,以及使用的命令提示符。
# 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 :(得分: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中提到了替代方案。
答案 1 :(得分:1)
当然!您可以使用__ import _ 内置函数,例如__import__(problem)
。但是不建议使用它,因为它在编码风格方面不是很好。我认为如果你将它用于测试目的,那么你应该使用unittest模块,无论哪种方式都试图避免这些结构。
此致
答案 2 :(得分:0)
你可以使用exec()技巧:
import sys
problem = sys.argv[1]
exec('import %s' % problem)
exec('%s.main()' % problem)