Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Windows平台上安装脚本时添加.py扩展名_Python_Package - Fatal编程技术网

Python 在Windows平台上安装脚本时添加.py扩展名

Python 在Windows平台上安装脚本时添加.py扩展名,python,package,Python,Package,如何将setup.py配置为在Windows平台上安装带有.py前缀的脚本,但在所有其他平台上都没有前缀?我想解决的问题是 我的软件包设置如下: MyPackage ├── CHANGES ├── ... ├── scripts │   └── myprogram ├── setup.py └── mypackage ├── __init__.py ├── ... └── myprogram.py 在我的setup.py文件中,我声明scripts/myprogram为

如何将
setup.py
配置为在Windows平台上安装带有
.py
前缀的脚本,但在所有其他平台上都没有前缀?我想解决的问题是

我的软件包设置如下:

MyPackage
├── CHANGES
├── ...
├── scripts
│   └── myprogram
├── setup.py
└── mypackage
    ├── __init__.py
    ├── ...
    └── myprogram.py
在我的setup.py文件中,我声明
scripts/myprogram
为可安装的脚本,带有

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from setuptools import setup

...

setup(
    name='MyPackage',
    ...
    packages=['mypackage'],
    scripts=['scripts/myprogram'],
    ...
)
myprogram
脚本只是一个简单的包装器,它只调用
mypackage.myprogram.main()


在*nix平台上,它以
myprogram
的名称将
myprogram
安装为可执行文件,这正是我所希望的,但在Windows上,它也以
myprogram
的形式安装在
C:\PythonXX\Scripts
目录中,因此在命令行上无法识别。如何让安装脚本在Windows上安装
myprogram
myprogram.py
,以便Windows识别文件类型以使其可执行?

我找到了答案:
setup()
的一个关键字参数,名为
entry\u points
,其中包含
'console\u scripts'
,如a中所述

新的
setup
调用如下所示:

 setup(
    name='MyPackage',
    ...
    packages=['mypackage'],
    entry_points={
        'console_scripts': [
            'myprogram = mypackage.myprogram:main'
        ]
    }
    ...
)
在做了这些更改之后,我从中删除了
脚本
目录和
myprogram
文件

现在运行安装程序时,distribute在
C:\PythonXX\Scripts
下创建两个文件:
myprogram script.py
myprogram.exe
。因此,用户现在可以在*nix或Windows平台的命令行上输入
myprogram
,并始终让它运行相同的程序。非常方便

 setup(
    name='MyPackage',
    ...
    packages=['mypackage'],
    entry_points={
        'console_scripts': [
            'myprogram = mypackage.myprogram:main'
        ]
    }
    ...
)