2

我有一个主脚本,它在主目录的子文件夹中执行几个子脚本。

文件夹层次结构如下所示:

MyFolder\MasterScript.py
MyFolder\ChildOneScript\ChildOne.py
MyFolder\ChildTwoScript\ChildTwo.py
MyFolder\ChildThreeScript\ChildThree.py

从 MasterScript 中,我需要在 ChildOne“myChildFunction”中调用一个函数并将一些变量传递给它。问题是,我不能简单地做

import ChildOneScript.ChildOne as ChildOne
ChildOne.myChildFunction

因为还有其他脚本依赖于 ChildOne 的相对路径。因此,如果我从 MasterScript 将 ChildOne 导入 MyFolder 目录并在那里调用 myChildFunction,我会收到回溯错误,指出找不到其他文件。这是由于另一个顽固的程序员的错误,他拒绝更改他的相对路径调用,因为这是很多手工工作。

那么,有没有办法从 MasterScript 中调用 myChildFunction传递一些变量?

我知道我可以使用 subprocess.call 和它的 cwd 参数来更改工作目录,但我不知道是否可以调用特定的 myChildFunction 并使用 subprocess 传递它的变量。

编辑:是否可以使用 execfile 传递变量?

4

2 回答 2

2

你总是可以用这个os模块破解它。它不漂亮,但它可能是你能做到的最好的,而无需重写所有其他人的代码。如果您将大量使用其他脚本中的函数,我会为它们编写一个包装器,以便更容易调用它们:

import sys
import os

def call_legacy_func(func, *args, **opts):
    prev = os.path.abspath(os.getcwd()) # Save the real cwd
    try:
        # Get the child's physical location.
        func_path = sys.modules[func.__module__].__file__
    except:
        # Die; we got passed a built-in function (no __file__)
        # Or you could just call it, I guess: return func(*args, **opts)
        return None

    # Change to the expected directory and run the function.
    os.chdir(func_path)
    result = func(*args, **opts)

    # Fix the cwd, and return.
    os.chdir(prev)
    return result

import ChildOneScript.ChildOne as ChildOne
call_legacy_func(ChildOne.myChildFunction, 0, 1, kwarg=False)
于 2013-03-12T17:02:51.200 回答
2

你能澄清你的问题吗?特别是,我不清楚文件夹布局和从下标导入的问题是什么。

例如,如果我创建以下目录结构:

/example
    __init__.py
    master.py
    /childone
        __init__.py
        childone.py
    /childtwo
        __init__.py
        childtwo.py

其中__init__.py只是空文件,源文件如下:

# master.py
from childone.childone import childone_fxn
from childtwo.childtwo import childtwo_fxn

print "Calling child one"
childone_fxn()

print "Calling child two"
childtwo_fxn()

--

# childone.py
def childone_fxn():
    print "hello from child one"

--

def childtwo_fxn():
    print "hello from child two"

/example然后我可以从内部运行master.py并获得预期的输出:

example $ python master.py 
Calling child one
hello from child one
Calling child two
hello from child two       

如果您想像对待任何其他可执行文件一样对待子脚本,您当然可以使用 subprocess 模块,但我看不出您不能直接导入子脚本的任何原因。但也许我误解了你的问题......

于 2013-03-12T17:11:55.350 回答