首页 > 解决方案 > 如何在不使用文件中的相对导入的情况下从不同目录中的 Python 脚本执行文件(导入其他模块)?

问题描述

我想跟踪通过运行文件调用的函数序列driver.py。该文件位于另一个目录中,而我用来跟踪使用时调用的函数的脚本driver.py位于另一个(不同的)目录中。当我转到目录driver.py并在终端中运行它时,它运行良好。但是,当我从我的 Python 脚本(用于生成功能序列的那个)运行相同的函数时,我得到No module found error了 driver.py 进行的导入的 s 。条件是,我根本无法改变driver.py

这是我的文件结构: /Users/aviralsrivastava/dev/generate_uml/generate_ruml.py(A)调用/Users/aviralsrivastava/dev/generate_uml/generate_sequence_diagram.py(B)中导入/Users/aviralsrivastava/Desktop/source_code_to_study/driver.py(驱动程序)的函数。

这就是 A 调用 B 的方式:

generate_sequence_diagram = GenerateSequenceDiagram('/Users/aviralsrivastava/Desktop/source_code_to_study/driver.py')
called_functions = generate_sequence_diagram.get_called_functions('main_2')

这是B的样子:

from trace import Trace
import importlib
# from driver import main_2
import os


class GenerateSequenceDiagram:
    def __init__(self, driver_module):
        # self.driver_module = __import__(driver_module)
        print('inside init of gen seq diag, dir is: {}'.format(os.getcwd()))
        # self.driver_module = importlib.import_module(driver_module)
        self.driver_module_spec = importlib.util.spec_from_file_location('driver', driver_module)
        self.driver_module = importlib.util.module_from_spec(self.driver_module_spec)

    def get_called_functions(self, driver_function):
        self.driver_module_spec.loader.exec_module(self.driver_module)
        self.driver_function = getattr(self.driver_module, driver_function)
        self.driver_function()
        # print(dir(self.driver_function))
        # print(self.driver_function.__name__)
        tracer = Trace(countfuncs=1)
        tracer.run('{}()'.format(self.driver_function.__name__))
        results = tracer.results()
        called_functions = results.calledfuncs
        return called_functions


# ob = GenerateSequenceDiagram('driver')
# print(ob.get_called_functions('main_2'))

这是驱动程序的样子:

# from .source_code_to_study import car, transport, vehicles
import sys
# sys.path.insert(0, '/Users/aviralsrivastava/dev/source_code_to_study')
import car, vehicles, transport

# def main():
#     tractor_pollution_permit = transport.TractorPollutionPermit()
#     tractor_pollution_permit.fetch_tractor(2018, True)
#     tractor_pesticides = transport.TractorPesticides()
#     tractor_pesticides.fetch_pesticides_permit(11)
#     car_ = car.Car(model='Tesla')
#     car_.pollution_permit(20000)
#     bike = car.Bike('Harley', 2019)
#     bike.pollution_permit(200000)
#     bike.check_farzi()


def main_2():
    print('Inside main_2 func')
    car_ = car.Car(model='Tesla')
    car_.pollution_permit(20000)
    bike = car.Bike('Harley', 2019)
    bike.pollution_permit(200000)
    bike.check_farzi()
    # tractor_pollution_permit = transport.TractorPollutionPermit()
    # tractor_pollution_permit.fetch_tractor(2018, True)
    # tractor_pesticides = transport.TractorPesticides()
    # tractor_pesticides.fetch_pesticides_permit(11)

main_2()

driver.py所在目录的内容为:

.
├── car.py
├── driver.py
├── transport.py
└── vehicles.py

0 directories, 4 files

标签: pythonpython-3.x

解决方案


由于这似乎是一回事,因此在目录中附加您需要导入的文件sys.path似乎是一个足够合理的解决方案。

import sys

sys.path.append('directory/path/with/files/to/import')

推荐阅读