为什么从setup.py调用Python脚本会调用Python shell呢?
我尝试在安装期间使用自定义安装从setup.py调用Python脚本:为什么从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,
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
表示要执行的程序及其参数。混合使用这两种方法会产生奇怪的结果。