Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从子目录运行_Python_Django_Python 2.7 - Fatal编程技术网

Python从子目录运行

Python从子目录运行,python,django,python-2.7,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/

我有以下文件层次结构:

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的子文件夹都可以直接适应,而无需将任何导入行强制到main.py脚本

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


有可能吗?

如果您不想使用任何导入语句,请使用
os
模块 这可以使用操作系统(命令)


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

我将空的
\uuuu init\uuuuu.py
文件添加到
Main/、A/、B/和C/
。我还在每个
.py
文件中添加了以下函数,这样我们就可以调用:

def f():
    print __name__
main.py
中,重要的函数是get\u模块,它调用

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

$ 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

简短的回答是:是的,这是可能的:)但是您希望将它们作为单独的脚本运行(因此
pythonc/a.py
),还是需要在main.py中导入和调用它们?第二个会使事情复杂化。第一个很简单,系统可能会调用popen。。。我在找第二个。将在问题中澄清“不强制将任何导入行导入main.py脚本”是什么意思?这里的
django
标记是什么意思?@Roelant我不想添加:从D导入*
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