如何分发由外部命令执行的代码?Bash脚本?

2024-03-28 19:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:根据下面的讨论,我认为我的问题真的适用于任何语言。Python通过pip自然有一个打包系统和安装过程。但假设这是C代码或perl脚本。用户仍然可以下载程序文件,并且可以通过capsall input.txt在命令行中执行代码。在

我有一个python脚本,它接受一个输入文件并给出一个输出文件。在

例如,这个脚本file1.py接受一个输入文本文件并输出一个所有字母都大写的文本文件:

import sys
inFile = sys.argv[1]
outFile = sys.argv[2]

with open(inFile,'r') as input_file:
    lines = input_file.readlines()

# process the input file somehow
# here we simply capitalize the text, 
# but naturally something more complex is possible

capitalized_lines = []
for line in lines:
    capitalized_lines.append(line.upper())

with open(outFile,'w') as output_file:
    for line in capitalized_lines:
        output_file.write(line)

用户现在执行此代码的方式

^{pr2}$

假设我想发布这段代码,这样用户就可以下载一个tarball,并能够在命令行中使用(例如)执行上面的操作

capsall input.txt

它将运行python file1.py并输出文件output.txt。有人写bash脚本吗?如果是这样的话,如何分发代码,以便用户在他们的路径中拥有这些代码?在


Tags: 文件代码命令行用户txt脚本inputoutput
2条回答

为此,我建议使用python打包(例如,[pip])。不管你喜欢什么样的包装方法,除非你喜欢。您的用户已经安装了python,因为他们已经被用来显式地将脚本传递给解释器。如果您对使用python打包感兴趣,请继续阅读。在

首先,我将把你的脚本和其他需要的处理放在一个包中。我们称之为mylibrary。你的项目应该看起来像:

myproject
 |  README.rst
 `  myproject
  |  __init__.py
  `  capsall.py

保持初始化py简单,并确保可以导入它而不需要依赖关系。我用的是:

^{pr2}$

接下来,添加一个名为设置.py在根上。这将定义您的包、它的元数据以及要安装到用户的$PATH中的脚本。以下将很好地工作:

#!/usr/bin/env python
import setuptools
import myproject

setuptools.setup(
    name='myproject',
    version=myproject.version,
    description='Package of useful utilities.',
    long_description=open('README.rst').read(),
    url='https://github.com/me/myproject',
    author='Me',
    author_email='me@example.com',
    packages=['myproject'],
    entry_points={
        'console_scripts': ['capsall=myproject.capsall:main'],
    },
    license='BSD',
)

如果你打算上传到pypi.python.org,则至少需要那么多元数据。我建议也添加classifiers。关于写a设置.py是无价的。在

您最感兴趣的部分是entry_points关键字参数。它定义了调用包的各种方式。您正在寻找console_scripts,因为它创建安装到本地路径中的shell脚本。有关详细信息,请参阅setuptools documentation。在

我在上面给出的console_scripts定义创建了一个名为capsall的脚本,该脚本调用my project.capsall.main函数。我会把你的代码重新打包到一个项目中。将脚本绑定到main函数中capsall.py公司模块。然后生成一个源存储库并将其上载到pypi.python.org(./setup.py sdist register upload)。上传后,用户可以使用pip install myproject进行安装。在

很可能你有你不想给外界的代码。如果是这样,那么您可以生成一个源发行版并使tarball在内部服务器上可用./setup.py sdist将在dist目录中生成tarball。然后pip install whatever/myproject-0.0.0.tar.gz将安装脚本。在

在脚本文件的顶部添加一个“hash-bang”,告诉bash调用Python解释器。同时使脚本可执行:

#!/usr/bin/env python
import sys

inFile = sys.argv[1]
outFile = sys.argv[2]
...

使脚本文件可执行:

^{pr2}$

现在可以使用以下命令运行脚本:

$ ./capsall input.txt output.txt

或者如果capsall在您的路径上:

$ capsall input.txt output.txt

相关问题 更多 >