2012-02-25 3 views
1

У меня есть 3 файла python. (First.py, second.py, third.py) Я выполняю второй файл python из 1-го файла python. Второй файл python использует оператор import для использования 3-го файла python. Это то, что я делаю. Это мой код.Как выполнить вложенные файлы python

first.py

import os 
file_path = "folder\second.py" 
os.system(file_path) 

second.py

import third 
... 
(rest of the code) 

third.py (который содержит ReportLab код для генерации PDF)

.... 
canvas.drawImage('xyz.jpg',0.2*inch, 7.65*inch, width=w*scale, height=h*scale) 
.... 

когда я выполнения этого кода , он дает ошибку

IOError: Cannot open resource "xyz.jpg" 

Но когда я выполняю файл second.py напрямую, написав python second.py, все работает отлично .. !!

Даже я попробовал этот код,

file_path = "folder\second.py" 
execfile(file_path) 

Но это дает эту ошибку,

ImportError: No module named third 

Но, как я сказал все работает нормально, если я непосредственно выполнить second.py файл. !!

Почему это происходит? Есть ли лучшая идея для выполнения таких вложенных файлов python? Любая идея или предложения были бы весьма полезны.

Я использовал эти три файла, чтобы дать основную идею моей структуры. Вы можете рассматривать этот поток исполнения как один процесс. Слишком много таких процессов, и каждый файл содержит тысячные строки кодов. Вот почему я не могу изменить весь код для модуляции, который может использоваться оператором import. :-( Итак, вопрос заключается в том, как создать один файл python, который позаботится о выполнении всех других процессов. (Если мы выполняем каждый процесс индивидуально, все работает нормально)

+5

Это замечательно плохой способ создания приложения Python из отдельных модулей. Использование 'os.system' для запуска другого скрипта python довольно глупо. 'execfile' немного лучше. Импортировать лучше. Вы действительно должны переделать свой дизайн, чтобы ваши различные модули имели функции, которые вы можете импортировать и вызывать, а не продолжать попытки выполнить эту работу. –

+0

Я смущен относительно того, чего добивается вызов os.system, но на самом деле вам нужно импортировать другие модули python для их выполнения, а не выходить из оболочки и запускать их. –

+1

Не уверен, что это относится к вашей проблеме, но обратная косая черта в строках имени файла в вашем файле должна быть удвоена или они будут интерпретироваться как символы escape-строки и не ссылаться на предполагаемые файлы. – martineau

ответ

1

Это должно быть легко, если вы сделаете это правильно. Есть несколько шагов, которые вы можете выполнить, чтобы настроить его.

Шаг 1: Установите файлы до запускать или импортировать

#!/usr/bin/env python 

def main(): 
    do_stuff() 

if __name__ == '__main__': 

__name__ special variable будет содержать __main__ при вызове в качестве сценария, а также имя модуля, если импортируется. Вы можете использовать это, чтобы предоставить файл, который можно использовать в любом случае.


Шаг 2: Сделайте свой подкаталог пакет

Если добавить пустой файл с именем __init__.py к folder, становится package, что вы можете импортировать.


Шаг 3: Импорт и запускать сценарии

from folder import first, second, third 

first.main() 
second.main() 
third.main() 
1

То, как вы делаете дело, недействительный

Вы должны:. создать главное приложение и импортировать 1,2,3

В 1,2,3:. Вы должны определить то, как ваши функции Затем вызовите их из основного приложения..

IMHO: Мне не нужно, чтобы у вас было много кода для размещения в отдельных файлах, вы просто помещаете их в o ne с определениями функций и правильно их вызывать.

0

I second S.Lott: You действительно должен переосмыслить ваш дизайн.

Но просто дать ответ на конкретную проблему: Из того, что я могу догадаться, до сих пор, у вас есть second.py и third.py в folder, наряду с xyz.jpg. Чтобы выполнить эту работу, вам сначала придется сменить рабочий каталог.Попробуйте в этом случае в first.py:

import os 
.... 
os.chdir('folder') 
execfile('second.py') 

Попробуйте прочитать о os module.

+1

Thnx много Маркус за ваш ответ. Но, к сожалению, этот код не работает в моем случае. –

0

Будущие читатели:

Прадьюмны в ответ from here решить второй вопрос MOIN Ахмеда для меня:

импорт SYS , измените «sys.path», добавив путь во время выполнения , затем импортируйте модуль, который поможет

[т. sys.path.append (каталог execfile)]

Смежные вопросы