2017-02-14 7 views
2

Lua 5.1のパッケージパスでデータファイルを読み取る方法は?Luaのパッケージパスでデータファイルを読み取る方法5.1

私が探しているのは、io.readのようなものですが、作業ディレクトリ(arg[0])の代わりにパッケージディレクトリにあり、ハードコードされた絶対パスは使用していません。それはdofileのようなものですが、コードを実行することなく、それを文字列として読み込むだけです。

私はtestフォルダ、test.luaスクリプトの現在の作業ディレクトリを持っています。

別のフォルダにluapackageのパッケージがあります。これは、LUA_PATH環境変数で指定されています。

luapackageことができます。

  • require("luapackage.other_module")
  • dofile("other_module.lua")

しかしluapackageを行うことはできません。

  • io.read("data.txt")
  • io.read("luapackage/data.txt")

サンプル構造:

+-test/ 
    | 
    +-test.lua 

+-luamodule/ 
    | 
    +-data.txt 
    | 
    +-luamodule.lua 
    | 
    +-other_module.lua 

をこの例では、test.luaのみluamoduleが必要です。

-- test.lua 
local luamodule = require("luamodule") 

そしてluamoduleは、そのモジュールとデータファイルを読み込む必要があります:

-- luamodule.lua 
local other_module= dofile("other_module.lua") -- works 
-- local other_module= require("luamodule.other_module") -- also works 

local data = io.open("data.txt") -- fails 
-- local data = io.open("luamodule/data.txt") -- also fails 

それは作業ディレクトリ(test)といないでファイルを検索しますので、それは動作しません。パッケージディレクトリ。

実行中のスクリプトのフォルダにパッケージのコピーを配置すると、io.read(luapackage/data.txt)が可能です。しかし、すべてのスクリプトはローカルコピーluapackageを持っていなければなりません。

注:互換性を損なう可能性のあるバイナリパッケージを避けて、私はLuaソリューションを探しています。

答えて

1

debug.getinfo(1,"S").sourceを使用すると、現在の(モジュール)ファイルの場所を取得できます。 luamodule.luadata.txtに置き換え、先頭にある@を削除して、必要なパスを取得する必要があります。

+0

ありがとうございます! ローカルPATH = string.match(debug.getinfo(1、 "S")。source、 "^ @(。+ /)[%a% - %d _] +%。lua $") 'および*voilà *! –

関連する問題