Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从不同目录中的Python脚本执行文件(导入其他模块),而不在文件中使用相对导入?_Python_Python 3.x - Fatal编程技术网

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

如何从不同目录中的Python脚本执行文件(导入其他模块),而不在文件中使用相对导入?,python,python-3.x,Python,Python 3.x,我想通过运行文件driver.py来跟踪调用的函数序列。该文件位于另一个目录中,我用来跟踪使用driver.py时调用的函数的脚本位于另一个(不同)目录中。当我转到driver.py目录并在终端中运行它时,它运行良好。但是,当我从Python脚本(用于生成函数序列的脚本)运行相同的函数时,对于driver.py进行的导入,我得到了No module found errors。条件是,我根本无法更改driver.py 这是我的文件结构: /Users/aviralsrivastava/dev/ge

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

这是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()

这就是驱动程序的外观:

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
的文件似乎是一个足够合理的解决方案

导入系统 append('directory/path/with/files/to/import')
这似乎是一件很重要的事情。您不能在脚本中将目录添加到
sys.path
中吗?您能回答这个问题吗?成功了!