python - 如何在不使用文件中的相对导入的情况下从不同目录中的 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
解决方案
由于这似乎是一回事,因此在目录中附加您需要导入的文件sys.path
似乎是一个足够合理的解决方案。
import sys
sys.path.append('directory/path/with/files/to/import')
推荐阅读
- php - 为 phpmailer 设置退回邮件
- angular - Angular Chrome 扩展 PDFMerge(需要)
- reactjs - 用于创建反应应用程序的自定义反应脚本不起作用
- spring-data-jpa - 额外的查询被触发以获取序列下一个值-spring JPA
- reporting-services - SSRS - 如何创建表达式列的总和(总计)?
- azure - 创建资源时触发 Azure Function
- postgresql - 无法在 PostgreSQL 中删除模式
- python - 如何按文本查找元素,但它是硒中的数字
- ios - 通过颤振从 iPhone 发送短信
- android - addPaymentMethod Stripe + firebase android