Python从子目录运行

时间:2017-03-20 11:47:38

标签: python django python-2.7

我有以下文件层次结构:

main.py
Main/
      A/
         a.py
         b.py
         c.py
      B/
         a.py
         b.py
         c.py
      C/
         a.py
         b.py
         c.py

从main.py我想执行任何子文件夹中的任何脚本。

用户将传递字符串A_a.py或B_a.py。该字符串将被解析并更改为A / a.py或B / a.py

我希望这种方法是动态的,例如为例如添加任何子文件夹具有a.py,b.py和c.py的D将直接适应而不强制任何导入行到main.py脚本。

我知道可以使用像pOpen这样的shell调用来完成。但是想在代码中执行它。

有可能吗?

2 个答案:

答案 0 :(得分:2)

我将空__init__.py个文件添加到Main/, A/, B/, and C/。我还在每个.py文件中添加了以下函数,以便我们可以调用:

def f():
    print __name__

main.py中,重要的函数是get_module,它调用import_module from importlib

import errno
from importlib import import_module
import os
from shutil import copytree
import sys

base = 'Main'

def get_module(arg):
    # 'X_x.py' becomes 'X.x'
    name = arg.strip('.py').replace('_', '.')
    # full_name will be 'Main.X.x'
    full_name = base + '.' + name
    try:
        return import_module(full_name)
    except ImportError as e:
        print e

def main():
    # D is not listed
    print os.listdir(base)
    # works for A
    mod = get_module('A_a.py')
    if mod:
        mod.f()
        # can also call like this
        mod.__dict__['f']()
    # doesn't work for D
    mod = get_module('D_a.py')
    if mod:
        mod.f()
        mod.__dict__['f']()
    # copy files from A to D
    try:
        copytree(os.path.join(base, 'A'),
                 os.path.join(base, 'D'))
    except OSError as e:
        print e
        if e.errno != errno.EEXIST:
            sys.exit(-1)
    # D should be listed
    print os.listdir(base)
    # should work for D
    mod = get_module('D_a.py')
    if mod:
        mod.f()
        mod.__dict__['f']()

if __name__ == '__main__':
    main()

如果一切顺利,这应该是输出:

$ python2.7 main.py
['__init__.py', '__init__.pyc', 'A']
Main.A.a
Main.A.a
No module named D.a
['__init__.py', '__init__.pyc', 'D', 'A']
Main.D.a
Main.D.a

答案 1 :(得分:-1)

如果您不想使用任何import语句,请使用os模块 这可以使用os.system(command)

完成
# main.py
# string = A_a.py, B_b.py
string = raw_input("Enter file to run ")
dirname = string[:1]
filename = string[2:]

os.chdir('Main/'+dirname)
os.system('python %s' %filename)

如果文件/目录不存在,那就是另一种情况。