在Nixpkgs中,是什么使python派生成为应用程序而不是库?

在Nixpkgs中,是什么使python派生成为应用程序而不是库?,python,nix,nixpkgs,Python,Nix,Nixpkgs,我试图为Nix打包一个python应用程序,但是我发现大多数文档都假设我想要打包一个库 为了做到这一点,我查看了Rednotebook示例(并非出于任何特殊原因,只是我碰巧知道它是用python编写的),该示例可以在中找到,但由于该文件非常庞大,下面是相关部分: redNotebook = buildPythonPackage rec { name = "rednotebook-1.8.1"; src = pkgs.fetchurl { url = "mirro

我试图为Nix打包一个python应用程序,但是我发现大多数文档都假设我想要打包一个库

为了做到这一点,我查看了Rednotebook示例(并非出于任何特殊原因,只是我碰巧知道它是用python编写的),该示例可以在中找到,但由于该文件非常庞大,下面是相关部分:

  redNotebook = buildPythonPackage rec {
    name = "rednotebook-1.8.1";

    src = pkgs.fetchurl {
      url = "mirror://sourceforge/rednotebook/${name}.tar.gz";
      sha256 = "00b7s4xpqpxsbzjvjx9qsx5d84m9pvn383c5di1nsfh35pig0rzn";
    };

    # no tests available
    doCheck = false;

    propagatedBuildInputs = with self; [ pygtk pywebkitgtk pyyaml chardet ];

    meta = {
      homepage = http://rednotebook.sourceforge.net/index.html;
      description = "A modern journal that includes a calendar navigation, customizable templates, export functionality and word clouds";
      license = licenses.gpl2;
      maintainers = with maintainers; [ tstrobel ];
    };
  };
我的推导如下:

{ pkgs ? import <nixpkgs> {} }:
let
  requirements = import ./nix/requirements.nix { inherit pkgs; };
in
pkgs.python35Packages.buildPythonPackage rec {
  name = "package-name";
  version = "1.0.0";
  namePrefix = "";
  src = ./.;
  doCheck = false;
  propagatedBuildInputs = builtins.attrValues requirements.packages;
}
{pkgs?导入{}}
让
requirements=import./nix/requirements.nix{inherit pkgs;};
在里面
pkgs.python35Packages.buildPythonPackage rec{
name=“包名”;
version=“1.0.0”;
名称前缀=”;
src=./。;
多切克=假;
propagatedBuildInputs=builtins.attrValues requirements.packages;
}
requirements.nix
pypi2nix
requirements.packages
的输出,类型为“派生列表”。尽管如此,当我将cd放入Rednotebook的结果存储路径时,有一个带有一些包装脚本的
/bin
目录。我的应用程序的存储路径只有一个
lib
no
/bin

我如何告诉Nixpkgs我有一个应用程序?

有和函数,但在一天结束时,它们都会调用


一个带有简单Nix包的Python应用程序可以参考:;它使用
buildPythonApplication
。生成的派生在
/nix/store/PACKAGE/bin/
buildPythonPackage
中包含一个包装,用于库,也就是说,当您希望它在
站点包中公开其模块时
buildPythonApplication
适用于恰好用Python编写的应用程序。在这种情况下,当您在另一个派生中包含这样的派生时,您不希望公开库

这种分离很重要,因为Python 3环境可能会调用用Python 2编写的工具,反之亦然


请注意,在撰写本文时,这个问题尚未完全解决,但至少
python.buildEnv
python.withPackages
将不包括应用程序及其依赖项。

正在尝试构建和安装用python编写的示例服务。 最后在我的安装程序中使用了
buildPythonApplication

要点 如果您正在利用
setuptools
分发应用程序,您需要在
设置中设置
入口点
调用:

来自distutils.core导入设置
设置(
...
入口点={
'控制台脚本':['sample\u module=src.app:main']
}
src-源代码文件夹 应用程序-入口点模块名称 main-入口点函数的名称

我的整个构建配置是:

# sample.nix
with (import <nixpkgs> {});
python37.pkgs.buildPythonApplication rec {
    pname = "sample_service";
    version = "0.0.3";
    src = ./sample_package;
    meta = with lib; {
        homepage = "https://www.example.com";
        description = "Sample Python Service";
    };
}

主要区别在于
buildPythonApplication
显然没有将解释器版本添加到结果输出名称中。这是构建服务的中间步骤。为了清晰起见,我省略了这些元素。