2012-02-25 56 views
1

我有3個python文件(first.py,second.py,third.py)我從第一個python文件執行第二個python文件。第二個python文件使用'import'語句來使用第三個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(其含有用於產生PDF ReportLab代碼)

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

當我執行此代碼,它會給出錯誤

IOError: Cannot open resource "xyz.jpg" 

但是,當我通過編寫python second.py直接執行second.py文件,一切工作正常。

即使我嘗試這個代碼,

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

但它給這個錯誤,

ImportError: No module named third 

但正如我所說的一切工作正常,如果我直接執行second.py文件。 !

爲什麼會發生這種情況?執行這樣的嵌套python文件有沒有更好的主意? 任何想法或建議將不勝感激。

我使用這三個文件只是爲了給出我的結構的基本思想。您可以將此流程視爲單個流程。像這樣的過程太多,每個文件都包含第1000行代碼。這就是爲什麼我無法將整個代碼更改爲可由import語句使用的模塊化代碼。 :-( 所以問題是如何製作一個單獨的python文件,它將負責執行所有其他進程(如果我們單獨執行每個進程,一切正常)

+5

這是從單獨模塊構建Python應用程序的一種非常糟糕的方式。使用'os.system'來運行另一個python腳本是相當愚蠢的。 'execfile'稍好些。導入它是最好的。你真的應該重做你的設計,以便你的各個模塊具有你可以導入和調用的功能,而不是繼續嘗試這個工作。 – 2012-02-25 12:26:18

+0

我很困惑os.system調用正在實現什麼,但是真的應該導入其他python模塊來執行它們,而不是打開shell並運行它們。 – 2012-02-25 12:28:32

+1

不確定它是否與您的問題相關,但是可以將文件名字符串中的反斜槓加倍,否則它們將被解釋爲字符串轉義字符並且不引用預期文件。 – martineau 2012-02-25 16:30:09

回答

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:你應該定義的東西你的函數然後從主應用程序調用它們。

恕我直言:我不需要你有很多代碼放入單獨的文件,你也只是把它們放到o ne函數定義文件並正確調用它們。

0

我第二S.Lott:你真的應該重新考慮你的設計。

但只是提供一個回答您的具體問題: 從我目前可以猜到,你有second.py和third.py在folder,與xyz.jpg一起。要做到這一點,你必須先改變你的工作目錄。嘗試在這種方式中first.py

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

嘗試唸叨os module

+1

Thrx很多Markus爲你的答案。但不幸的是,這個代碼不適用於我的情況。 – 2012-02-25 13:42:12

0

未來的讀者:

Pradyumna的回答from here解決穆因·艾哈邁德的第二個問題對我來說:

進口SYS ,在運行期間通過追加路徑來改變「sys.path」時間,然後導入模塊,將幫助

[即sys.path.append(execfile的目錄)]