3

Python内からUnixコマンドを実行したいことがよくありますが、最近、一部のコマンドが見つからないことがわかりました。例は「limit」コマンドです。

$ echo $SHELL
/bin/tcsh
$ limit vmemoryuse 1000m
$ python
Python 2.7.3 (default, Aug  3 2012, 20:09:51) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("echo $SHELL")
/bin/tcsh
0
>>> os.system("limit vmemoryuse 1000m")
sh: limit: command not found
32512
>>>

もう1つの例は、「setenv」コマンドです。これらのコマンドがPython内で機能しないのはなぜですか?「os」モジュールと「subprocess」モジュールの両方を使用しようとしましたが、成功しませんでした。Python内からこれらのコマンドを正常に呼び出すことができる別のモジュールまたはメソッドを知っている人はいますか?

4

1 に答える 1

8

これは、一部のシェルコマンドが実際にはプログラムではなく、内部シェルコマンドであるためです。

古典的な例はcd次のとおりです。外部プログラムの場合、シェルのディレクトリではなく、新しいプロセスの現在のディレクトリが変更されるため、外部プログラムにすることはできません。

大まかに言えば、2種類の内部シェルコマンドがあります。

  1. 効率のためにシェルによって実装されるコマンドですが、スタンドアロンプ​​ログラムとして存在します:、、、true.. ..falsetestsleep
  2. シェルの環境を変更するため、子プロセスから実行できないコマンド:、、、cd.. ..umasksetenvulimit

最初のカテゴリのコマンドは、シェル固有のものです。2番目のカテゴリのコマンドはそれほど多くありません。

詳細については、関連するシェルのマニュアルページを参照してください(man bashたとえば)。

また、特定のコマンドの実行について知りたい場合は、次のようにします。

$ type -a <command>

タイプはbashismであり、tcshで同等のものはわかりませんwhichが、外部プログラムであるため、次のようになります。

$ which -a <command>

コマンドが外部プログラムとして存在するかどうかが表示されますが、シェルの内部については何も知りません。

Pythonプログラムで内部コマンド(上記のタイプ2)の機能が必要な場合は、関連するシステムコールを使用する必要があります。うまくいけば、それはすでにいくつかのモジュールで利用可能になるでしょう。そうでない場合は、Cで独自のラッパーを作成する必要があります。

特定のコマンドについて:

  • 環境(setenvおよび)は、または、などgetenvで操作できます。os.environos.getenvos.putenv
  • プロセス制限(limit)については、リソースモジュールを参照してください。
于 2013-01-30T10:21:51.337 に答える