2

同じディレクトリで相互に参照する 2 つのスクリプトがある場合

A/
   foo.lua
   bar.lua

foo.lua

require "bar"

bar.lua

print "It worked"

その後、同じフォルダーからlua実行可能ファイルを実行すると機能します

cd A; lua foo.lua

しかし、別のフォルダーからインタープリターを実行すると、「モジュール 'バー' が見つかりません」というメッセージが表示されて失敗します

cd A/..; lua A/foo.lua

相対インポートが現在の作業ディレクトリに依存しないようにする方法はありますか? たとえば、バッチ ファイルでは、パスを からの相対パスに設定できますdirname $0

4

2 に答える 2

2

主な問題はpackage.path、実行中のスクリプトがあるディレクトリを考慮していないことです。

package.path = 'foobar_path/?.lua;'..package.path

別の作業ディレクトリから実行する予定のスクリプトに。簡単にするためにできることは、package.path必要なときに実行中のスクリプトのディレクトリを自動的に追加するモジュールを作成することです。このモジュールは、 にリストされているデフォルトの場所の 1 つにあるpackage.pathため、見つけることができます。

-- moduleroot.lua
local moduleroot = arg and arg[0]
if moduleroot then
  local path = moduleroot:match [[^(.+[\/])[^\/]+$]]
  if path and #path > 0 then
    package.path = path..'?.lua;'..package.path
    package.cpath = path..'?.dll;'..package.cpath
    return path
  end
end

-- foo.lua
require "moduleroot"
require "bar"

実際、これは十分に一般的な問題であり、Penlightにはこれを処理するための便利な機能が含まれていますpl.app.require_here

于 2013-08-04T11:58:47.683 に答える
2

これを行う通常の方法package.pathは、の親を含むように更新するA(またはAパスに配置する) ことです。次にrequire、モジュールをA.barおよびとして使用および参照します。A.foo

のマニュアルエントリを参照してくださいrequire

を使用してディレクトリを見つけることは可能ですが、アプリケーションでモジュールをdebug.getinfo使用するdebugことは良い考えではなく、この場合は必要ありません。

この関連する SO の質問を参照してください -- use package.path.

于 2012-07-30T01:01:23.783 に答える