Reputation: 2206
I'm creating a package in Julia and have followed the Package Development section of the Docs.
One of my functions opens and reads in a data file (mydata.txt
) that I'm storing in the package directory.
Everything works pretty great when I run the Julia from the package directory but not so great when I run the tests or run Julia from a different directory because it doesn't know where to find that data file.
I thought I could just do something like:
datapath = Pkg.dir("MyPkg") * "/data/"
to get an absolute path to the file but it still doesn't seem to work.
What is the correct way to provide an absolute file path for data in a package?
Upvotes: 5
Views: 2643
Reputation: 14735
In Julia 1.7 and above, you can simply do:
datapath = pkgdir("MyPkg", "data")
mytxtpath = pkgdir("MyPkg", "data", "mydata.txt")
# etc. - any number of path components are allowed as further arguments
For earlier versions (from either 1.3 or 1.4 version), replace Pkg.dir
in @ImanolLuengo's answer with pkgdir
:
joinpath(pkgdir("MyPkg"), "data", "mydata.txt")
Upvotes: 1
Reputation: 985
As of Julia 1.0, the answer by Imanol Luengo will produce a warning:
Warning:
Pkg.dir(pkgname, paths...)
is deprecated; instead, doimport PackageName; joinpath(dirname(pathof(PackageName)), "..", paths...)
"
so while it still works, it will stop working in a future version. The replacement suggested in the warning message seems to work:
joinpath(dirname(pathof(MyPkg)), "..", "data")
Inside the package you don't need the import.
Upvotes: 6
Reputation: 15909
In order to properly handle multi-platform directory files and paths, use Julia's built-in joinpath
method:
joinpath(Pkg.dir("MyPkg"), "data", "mydata.txt")
The resulting path will be valid in every platform.
Upvotes: 6