gpt4 book ai didi

python - 如何从不同目录中的 Python 脚本执行文件(导入其他模块)而不在文件中使用相对导入?

转载 作者:行者123 更新时间:2023-12-01 06:32:58 25 4
gpt4 key购买 nike

我想跟踪通过运行文件 driver.py 调用的函数序列。该文件位于另一个目录中,我用来跟踪使用 driver.py 时调用的函数的脚本位于另一个(不同的)目录中。当我进入 driver.py 目录并在终端中运行它时,它运行良好。但是,当我从 Python 脚本(用于生成功能序列的脚本)运行相同的函数时,对于 driver.py 进行的导入,我收到 No module found 错误。条件是,我根本无法更改 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

最佳答案

由于这看起来像是一件事,因此将目录与需要导入的文件附加到 sys.path 似乎是一个足够合理的解决方案。

import sys

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

关于python - 如何从不同目录中的 Python 脚本执行文件(导入其他模块)而不在文件中使用相对导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com