在Haskell中获取当前源文件的绝对路径
是否有可能在Haskell中获取当前源文件的绝对路径?在Haskell中获取当前源文件的绝对路径
我只能找到一个相关函数:getCurrentDirectory
从System.Directory
,但它“返回调用进程的当前目录的绝对路径”,而不是当前文件的路径。
(我需要它来阅读这是位于同一文件夹作为源文件样本输入;!如果有什么更好的办法来做到这一点,那将是有益的太)
的PseudoMacros package可能是有用的。据描述,它为当前的文件名类似C的字符串等
UPDATE
通过PseudoMacros返回的文件名等于传递给GHC的路径(相同的行为@JoachimBreitner在他的回答中提到) ,所以
import PseudoMacros
main :: IO()
main = putStrLn ("Hello from " ++ $__FILE__ ++ ", line " ++ show $__LINE__ ++ "!")
将打印
Hello from tmp.hs, line 5!
或
Hello from /tmp/tmp.hs, line 5!
这取决于您是否向ghc提供了相对或绝对文件名。
虽然它似乎没有包括目录。 –
@JoachimBreitner行为与您的解决方案相同 - 请参阅我的更新回答 –
好的,抱歉,如果不检查自己,可能会怀疑。 –
您可以使用CPP。如果您编译该文件
{-# LANGUAGE CPP #-}
main = print __FILE__
因为你把它传递给ghc
它将打印路径源 - 这可能是也可能不是完整的路径,但:
/tmp $ ghc --make mypath.hs
[1 of 1] Compiling Main (mypath.hs, mypath.o)
Linking mypath ...
/tmp $ ./mypath
"mypath.hs"
/tmp $ ghc --make /tmp/mypath.hs
Linking /tmp/mypath ...
/tmp $ ./mypath
"/tmp/mypath.hs"
作为替代,在这里可以使用file-embed包。它使用模板haskell来嵌入文件/目录。
这对于在可执行文件中嵌入资源或配置非常有用。以这种方式阅读样本输入可能不明智。 cabal中的data-files
可能是更好的选择,正如本文前面已经指出的那样。
你可以用文件嵌入运行相同的问题,但现在在0.0.10中有一个方便的函数:http: //hackage.haskell.org/package/file-embed-0.0.10/docs/src/Data-FileEmbed.html#makeRelativeToProject – jberryman
你是什么意思的“当前文件”?正在运行的编译的可执行文件的路径?或模块的源文件?或者是其他东西? – shang
@shang,对不起,我的意思是源文件。 – Dogbert
这是cabal的工作。使用'data-files'属性指定文件的位置,然后使用'getDataFileName'。更多信息在这里:http://www.haskell.org/cabal/users-guide/developing-packages.html#accessing-data-files-from-package-code – user2407038