【问题标题】:How to call a function within a python file that is a part of some other python file如何在作为其他 python 文件一部分的 python 文件中调用函数
【发布时间】:2015-10-04 06:22:42
【问题描述】:

标题可能不正确,但这是我能想到的最接近的。

我有一个文件 sample.py,它类似于使用 argparse 制作的命令行解析器。 根据参数,它正在调用其他 python 文件。 例如。 - 在 -C 中编译模块选项。

cmd>python sample.py -M module -C

根据模块名称,配置文件在module/configuration.py下

我必须从 configuration.py 文件中调用几个函数。最好的方法是什么。 我无法导入 python 文件,因为路径总是会变化,并且需要在运行时导入文件。

有没有办法解决这个问题?

我已阅读有关 importlib 包的信息,但无法让它为我使用。

我的框架结构:

sample.py
|
APIs
   |
    compile.py

/module/configuration.py

compile.py 文件示例

 #compile.py
import <packages>

def compile(module_name):
    # call some function in /module/configuration.py file.

问题是 module_name 是在编译函数中传递的,因此我不能在导入时使用。

我的问题可能太长或太明显,但我一直在苦苦挣扎。任何帮助表示赞赏。

【问题讨论】:

    标签: python python-2.7 python-importlib


    【解决方案1】:

    这个怎么样?

    # Equivalent to dynamically `import`ing `module`
    moduleName = 'module.configuration'
    module = __import__(moduleName)
    

    顺便说一句__import__()built-in function,因此您可以从任何地方访问它。虽然它比 importlib.import_module() 稍微复杂/复杂一点,但它更加灵活,而且与文档所说的相反,它在日常代码中非常有用。

    【讨论】:

    • run_py_file_path = "../../module/setup/configuration.py" run_py_file_module = __import__(str(run_py_file_path)) ImportError: Import by filename is not supported. 不知道这里有什么问题。
    • @AmitGoel:您不能通过文件系统路径import/__import__(),而是通过模块路径。这是一个基本规则。你应该这样做:import sys; sys.path.append('../..'); run_py_module_path = "module.setup.configuration"; run_py_module = __import__(run_py_module_path);,你会没事的:)。
    • @AmitGoel:如果你要使用__import__(),你需要添加module的父目录(不管实际的东西是否在module里面) sys.path。这样的路径是相对的还是绝对的并不重要。
    • 问题是 ../..//setup/*.py 在这个路径中的模块是可变的并且将由用户提供。这就是我将它保存在变量 run_py_file_path 中的原因。现在我正在做sys.path.append(run_py_file_path); run_py_file_module = __import__(run_py_file_path),但仍然遇到同样的错误。我知道我在做一些愚蠢的事情。请你纠正我。
    • @AmitGoel:如果&lt;module&gt; 是可变的,并且始终位于../..,并且不再涉及混乱,那么这应该可以一劳永逸地解决它:import sys; import os.path; sys.path.append('../..'); module_name = 'foo'; script_name = 'configuration.py'; __import__(os.path.join(module_name, 'setup', script_name))。如果您有任何其他疑问,请告诉我/我们 :)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多