如何通过命令提示符导入python文件?

时间:2014-09-26 15:22:59

标签: python python-2.7 import command

我正在研究项目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()?导入不能与存储为变量的文件名一起使用吗?有没有比通过命令提示符获取文件名更好的解决方案?如果我需要添加更多信息,请告诉我,并感谢您的帮助!

3 个答案:

答案 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)