Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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
为什么从setup.py调用Python脚本会调用Python shell呢?_Python_Subprocess_Pip_Easy Install - Fatal编程技术网

为什么从setup.py调用Python脚本会调用Python shell呢?

为什么从setup.py调用Python脚本会调用Python shell呢?,python,subprocess,pip,easy-install,Python,Subprocess,Pip,Easy Install,我尝试在安装期间使用自定义安装从setup.py调用Python脚本: class CustomInstall(install): def run(self): install.run(self) ... p = subprocess.Popen( [sys.executable, 'demo_package/deploy_database.py'], shell=True,

我尝试在安装期间使用自定义安装从setup.py调用Python脚本:

class CustomInstall(install):
    def run(self):
        install.run(self)

        ...

        p = subprocess.Popen(
            [sys.executable, 'demo_package/deploy_database.py'],
            shell=True,
            stdout=subprocess.PIPE,
            cwd=os.path.join(self.install_lib, 'demo_package'))

        out, err = p.communicate()

setup(..., cmdclass=dict(install=CustomInstall))
在Ubuntu机器上部署包时,该过程不会执行deploy_database.py,而是不会显示任何内容。当我使用Ctrl+C手动停止它时,输出似乎表明它没有实际运行deploy_database.py,而是简单地启动Python:

^CDownloading/unpacking PypiPackagesMonitoring
  Downloading demo-1.0.64.zip  
  Running setup.py egg_info for package demo

Installing collected packages: demo
  Running setup.py install for demo

    Python 3.3.2+ (default, Oct  9 2013, 14:50:09)
    [GCC 4.8.1 on linux
    Type "help", "copyright", "credits" or "license" for more information.
Cleaning up...
Operation cancelled by the user
Storing complete log in /home/.../.pip/pip.log

我调用Python脚本的方式有什么问题?我应该怎么做呢?

shell=True
不需要使用
[sys.executable,'demo\u package/deploy\u database.py']
,这会导致问题。您这样做的方式(如果省略
shell=True
)是首选方式,因为它绕过了shell

shell=True
使Popen将传递的命令移交给shell(例如,
/bin/bash
,具体取决于为当前用户配置的shell)。仅执行列表中传递的第一个命令,列表的其他元素作为参数传递给shell本身(从):

在shell=True的Unix上[…]如果args是一个序列,则第一项指定命令字符串,任何附加项都将被视为shell本身的附加参数


shell=True
有点危险,但在某些情况下也很有用。有关详细信息,请参阅。

shell=True
不需要与
[sys.executable,'demo\u package/deploy\u database.py']
一起使用,并且会导致问题。您这样做的方式(如果省略
shell=True
)是首选方式,因为它绕过了shell

shell=True
使Popen将传递的命令移交给shell(例如,
/bin/bash
,具体取决于为当前用户配置的shell)。仅执行列表中传递的第一个命令,列表的其他元素作为参数传递给shell本身(从):

在shell=True的Unix上[…]如果args是一个序列,则第一项指定命令字符串,任何附加项都将被视为shell本身的附加参数


shell=True
有点危险,但在某些情况下也很有用。有关详细信息,请参阅。

或者您可能会使用
execfile
shell=True
应该意味着您需要一个不能表示为简单字符串序列的功能,即当使用
shell=True
时,必须使用一个表示整个shell命令的字符串*(这不仅仅是调用外部程序,还包括一些shell功能,如管道/重定向/调用内置程序等)。否则,您应该使用
shell=False
,并且您可以使用相同格式的
sys.argv
来表示要执行的程序及其参数。混合使用这两种方法会导致这种奇怪的结果。或者您可能会使用
execfile
shell=True
来暗示您需要一种无法表达的功能d作为一个简单的字符串序列,即当使用
shell=True
时,必须使用一个表示整个shell命令的字符串*(这不仅仅是调用外部程序,还包括一些shell功能,如管道/重定向/调用内置命令等)。否则,您应该使用
shell=False
,并且您可以用相同格式的
sys.argv
表示要执行的程序及其参数。混合使用这两种方法会产生奇怪的结果。