我有一个包含两个文件的目录,main.py和flake.nix。
flake.nix:
{
description = "virtual environment with python and streamlit";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
python = pkgs.python311;
python_packages = python.withPackages(ps: with ps;[
ipython
matplotlib
pandas
]);
myDevTools = [
python_packages
];
in {
devShells.default = pkgs.mkShell {
buildInputs = myDevTools;
};
});
}
我应该在 flake.nix 中使用什么来创建与以下内容等效的可执行文件?
python main.py
我想用命令创建可执行文件
nix build
在 shell 中(这意味着安装了必要的软件包)
我已在我的文件中添加了应用程序:
{
description = "virtual environment with python and streamlit";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
python = pkgs.python311;
f = ps: with ps;[
ipython
matplotlib
pandas
];
pip_python_packages = python.withPackages(f);
myDevTools = [
pip_python_packages
pkgs.streamlit
];
outputName = builtins.attrNames self.outputs self.outputs;
in {
devShells.default = pkgs.mkShell {
buildInputs = myDevTools;
};
packages.default = pkgs.poetry2nix.mkPoetryApplication {
projectDir = self;
};
apps.default = {
program = "${python}/bin/python";
args = [ "main.py" ];
src = "./.";
type = "app";
};
});
}
但是nix运行只是为了打开python解释器。
此外,我输入这一行
nix/store/cxsw4x1189ppmsydhwsmssr0x65nygj7-python3-3.11.4/bin/python ./main.py
在我的壳里
因为 ${python} = cxsw4x1189ppmsydhwsmssr0x65nygj7-python3-3.11.4/bin/python
它不起作用:
ModuleNotFoundError:没有名为“pandas”的模块
我像这样更改了我的文件:
{
description = "virtual environment with python and streamlit";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
python = pkgs.python311;
f = ps: with ps;[
ipython
matplotlib
pandas
];
pip_python_packages = python.withPackages(f);
myDevTools = [
pip_python_packages
pkgs.streamlit
];
outputName = builtins.attrNames self.outputs self.outputs;
in {
devShells.default = pkgs.mkShell {
buildInputs = myDevTools;
};
packages.default = pkgs.poetry2nix.mkPoetryApplication {
projectDir = self;
};
apps.default = flake-utils.lib.mkApp {
program = "${pip_python_packages}/bin/python";
args = [ "${self}/main.py" ];
};
});
}
但是我运行后出现这个错误
nix run
:
错误: ...在评估属性“pkgs.buildPythonPackage”时
at /nix/store/s1z7nb9n6r5n0r34fabp6yybwkbr8mjk-source/pkgs/development/interpreters/python/passthrufun.nix:87:5: 86| withPackages = import ./with-packages.nix { inherit buildEnv pythonPackages;}; 87| pkgs = pythonPackages; | ^ 88| interpreter = "${self}/bin/${executable}"; … while calling the 'mapAttrs' builtin at /nix/store/s1z7nb9n6r5n0r34fabp6yybwkbr8mjk-source/pkgs/development/interpreters/python/passthrufun.nix:31:8: 30| value; 31| in lib.mapAttrs func items; | ^ 32| in ensurePythonModules (callPackage (stack trace truncated; use '--show-trace' to show the full trace) error: getting status of '/nix/store/c274sjvcr30c80429v9kpn4n2q0ic6n9-source/poetry.lock': No
这样的文件或目录
老问题,但这也许有帮助。
这里很多事情都是错误的。
但是nix运行只是为了打开python解释器。
是 -
args
在这里没有任何意义,因此被忽略。 只有type
和program
有任何意义。
它不起作用:
ModuleNotFoundError:没有名为“pandas”的模块
这是因为
python
就是 Python 运行时。您的库位于它们自己的派生中,因此无法从该派生中访问。
如果您使用诗歌2nix,那么您应该更多地依赖that。请参阅他们的模板片。
由于您没有包含
pyproject.toml
,因此很难重新创建您的设置,但可以通过以下方式添加这些包:
poetry add ipython streamlit matplotlib
然后您可以尝试类似这样的操作(请注意,poetry2nix 现在警告不要使用 nixpkgs 版本):
{
description = "virtual environment with python and streamlit";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs = {
poetry2nix = {
url = "github:nix-community/poetry2nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, flake-utils, poetry2nix }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
inherit (poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }) mkPoetryApplication;
in {
devShells.default = pkgs.mkShell {
inputsFrom = [ self.packages.${system}.default ];
};
packages.default = mkPoetryApplication {
projectDir = self;
};
}
);
}