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の相対パスに依存する他のスクリプトがあるためです。したがって、ChildOneをMasterScriptからMyFolderディレクトリにインポートし、そこでmyChildFunctionを呼び出すと、他のファイルが見つからないというトレースバックエラーが発生します。これは、多くの手作業であるため、相対パス呼び出しの変更を拒否する別の頑固なプログラマーのミスによるものです。

それで、MasterScript内からmyChildFunctionを呼び出して、それにいくつかの変数を渡す方法はありますか?

subprocess.callとcwd引数を使用して作業ディレクトリを変更できることは承知していますが、特定のmyChildFunctionを呼び出して、subprocessを使用して変数を渡すことができるかどうかはわかりません。

編集: execfileを使用して変数を渡すことは可能ですか?

4

2 に答える 2

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       

もちろん、子スクリプトを他の実行可能ファイルと同じように扱いたい場合は、サブプロセスモジュールを使用できますが、子スクリプトを直接インポートできない理由はわかりません。しかし、おそらく私はあなたの質問を誤解しています...

于 2013-03-12T17:11:55.350 に答える
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 に答える