2014-03-14 75 views
2

奇怪的問題在這裏。 我有一個在C++應用程序中通過dofile()執行的Lua腳本('human.lua')。Lua loadfile()無法在同一目錄中找到文件

我嘗試加載另一個文件是在第一線相當標準的方式的AI腳本:

behavior_chunk = assert(loadfile("testBehavior.lua")) 

這將引發「無法打開testBehavior.lua:沒有這樣的文件或目錄」 testBehavior .lua是在同一目錄作爲human.lua。

怎麼會出現這種情況? 能package.path被越來越設置錯誤不知何故? 我已經做了很多的研究這一點,並不能找到什麼可能會導致此具體問題

也許我錯過了一些非常明顯的東西。

+0

你是如何加載'human.lua'的? – lhf

+0

'package.path'不影響'loadfile'和朋友。 – lhf

+0

我使用dofile來運行'human.lua'腳本。 'std :: string fullname =「scripts /」+(std :: string)name; if(luaL_dofile(pLua,fullname。c_str())){fprintf(stderr,「無法運行Lua腳本文件:%s \ n」,lua_tostring(pLua,-1)); }' – user3418022

回答

1

loadfile路徑是相對於工作目錄而言的,而不是相對於腳本位置。因此,如果您從文件夾A啓動Lua以運行B\human.lua,那麼中的loadfile("C/testBehavior.lua")會在A/C中尋找testBehavior.lua,而不是在B/C中尋找。

所以如果你的文件夾結構是:

Foo 
    yourLuaApp.exe 
    Scripts 
    human.lua 
    file1.lua 
    file2.lua 
    ai 
     testBehavior.lua 

,說你有C++

int main(argc, char* argv[]) 
{ 
    ... init Lua ... 
    std::string fullname = "scripts/" + argv[1]; 
    if (luaL_dofile(pLua, fullname.c_str())) 
     std::cerr << "error" << endl; 
    else 
     std::cout << "success" << endl; 
} 

那麼你將得到這些結果:

C:\Foo> yourLuaApp.exe file1.lua 
success 
C:\Foo> yourLuaApp.exe ai\testBehavior.lua 
success 

C:\Foo\Scripts> ../yourLuaApp.exe file1.lua 
error 

因爲您正在從Scripts文件夾啓動您的應用程序,該文件夾不包含名爲Scripts的文件夾。

+0

它相對於當前的工作目錄。如果雙擊Windows中的.lua文件,那麼工作目錄可能就是Lua所在的目錄。 –

+0

感謝您的評論,這是有道理的。 – Schollii

+1

謝謝你們。 這裏是我如何在C++中運行腳本: std :: string fullname =「scripts /」+(std :: string)name; (luaL_dofile(pLua,fullname.c_str()))fprintf(stderr,「不能運行Lua腳本文件:%s \ n」,lua_tostring(pLua,-1)); } – user3418022

1

感謝您的更新。

但是加載腳本在C++中完美的作品,就會出現問題時,我從內Lua的腳本,我從C++加載加載一個Lua腳本:

behavior_chunk = assert(loadfile("testBehavior.lua")) 

我將如何正確使用的loadFile從一個Lua內腳本(而不是C++)在同一目錄或子目錄中加載另一個Lua文件?

我的推理是我從C++的'scripts'目錄加載'human.lua'。現在在'human.lua'裏面,我加載了與該腳本位於同一目錄中的另一個腳本,爲什麼不行?

也許我沒有足夠清楚。我很抱歉,如果是這樣的話。

相關問題